建造者模式
这个是zmo_xu的java设计模式系列的第三章.这里需要说明一下 我这里给出的代码并不是标准代码,应该说是我自己的学习笔记,拿出来与大家交流,也希望各位高手多多指教,在这里感谢javastudy给予的帮助!(感谢CCTV ,感谢父母 感谢滚石娱乐的什么就不说了 呵呵 好了 老规矩 言归正传[保存下 哈哈 ])
概述
在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法确相对稳定。如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?这就是要说的建造者模式。
本文通过现实生活中的买KFC的例子,用图解的方式来诠释建造者模式。
意图
将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
[注意:所有的设计模式都不是为了使我们的代码更简单,正恰恰相反 是更复杂,设计模式的目的 是提高 代码的重用 降低模块的耦合]{打听下怎么用最快的方法把word 里面的图片发上来 ....相册的方法就不要说了...}
生活中的例子
生成器模式将复杂对象的构建与对象的表现分离开来,这样使得同样的构建过程可以创建出不同的表现。这种模式用于快餐店制作儿童餐。典型的儿童餐包括一个主食,一个辅食,一杯饮料和一个玩具(例如汉堡、炸鸡、可乐和玩具车)。这些在不同的儿童餐中可以是不同的,但是组合成儿童餐的过程是相同的。无论顾客点的是汉堡,三名治还是鸡肉,过程都是一样的。柜台的员工直接把主食,辅食和玩具放在一起。这些是放在一个袋子中的。饮料被倒入杯中,放在袋子外边。这些过程在相互竞争的餐馆中是同样的。
客户端:顾客。想去买一套套餐(这里面包括汉堡,可乐,薯条),可以有1号和2号两种套餐供顾客选择。
指导者角色:收银员。知道顾客想要买什么样的套餐,并告诉餐馆员工去准备套餐。
建造者角色:餐馆员工。按照收银员的要求去准备具体的套餐,分别放入汉堡,可乐,薯条等。
产品角色:最后的套餐,所有的东西放在同一个盘子里面。
下面开始我们的买套餐过程。
1.客户创建Derector对象,并用它所想要的Builder对象进行配置。顾客进入KFC店要买套餐,先找到一个收银员,相当于创建了一个指导者对象。这位收银员给出两种套餐供顾客选择:1普通套餐,2黄金套餐。完成的工作如时序图中红色部分所示。
[养成保存文件的习惯 web程序也不例外]
- package unit3_Buider;
-
- import java.util.ResourceBundle;
-
- public class Client
- {
-
- public Client()
- {
- }
-
-
-
-
- public static void main(String[] args)
- {
-
- String configFile="food.properties";
- FoodManager foodmanager = new FoodManager();
-
- Builder instance;
-
- System.out.println("Please Enter Food No:");
-
- String No = 1+"";
- ResourceBundle bundle = ResourceBundle.getBundle(configFile);
-
- String foodType=bundle.getString("No"+No);
-
- try
- {
- instance = (Builder) Class.forName(foodType).newInstance();
-
- foodmanager.Construct(instance);
- }
- catch (InstantiationException e)
- {
- e.printStackTrace();
- }
- catch (IllegalAccessException e)
- {
- e.printStackTrace();
- }
- catch (ClassNotFoundException e)
- {
- e.printStackTrace();
- }
-
- }
-
- }
唉又一次华丽的提交失败了
产品(套餐)类:<o:p></o:p>
java 代码
- package unit3_Buider;
-
- import java.util.Enumeration;
- import java.util.Hashtable;
-
- public class Food
- {
- Hashtable food = new Hashtable();
-
- public void Add(String strName, String Price)
- {
- food.put(strName, Price);
- }
- public void Show()
- {
- System.out.println("Food List:");
- System.out.println("------------------------------");
- for (Enumeration e = food.elements(); e.hasMoreElements() ;) {
- System.out.println(e.nextElement());
- }
- System.out.println("\n------------------------------");
- }
-
- }
保存点
2.指导者通知建造器。收银员(指导者)告知餐馆员工准备套餐。这里我们准备套餐的顺序是:放入汉堡,可乐倒入杯中,薯条放入盒中,并把这些东西都放在盘子上。这个过程对于普通套餐和黄金套餐来说都是一样的,不同的是它们的汉堡,可乐,薯条价格不同而已。如时序图红色部分所示:
java 代码
- package unit3_Buider;
-
- public class FoodManager
- {
-
- public FoodManager()
- {
- }
-
- public void Construct(Builder builder)
- {
- builder.BuildHamb();
-
- builder.BuildCoke();
-
- builder.BuildChip();
- }
-
- }
3.建造者处理指导者的要求,并将部件添加到产品中。餐馆员工(建造者)按照收银员要求的把对应的汉堡,可乐,薯条放入盘子中。这部分是建造者模式里面富于变化的部分,因为顾客选择的套餐不同,套餐的组装过程也不同,这步完成产品对象的创建工作。
程序实现:
java 代码
- package unit3_Buider;
-
- public abstract class Builder
- {
-
- public Builder()
- {
- }
-
- public abstract void BuildHamb();
-
-
-
-
- public abstract void BuildCoke();
-
-
-
-
- public abstract void BuildChip();
-
-
-
-
-
- public abstract Food GetFood();
-
- }
今天就写到这里晚了 这样写好累的说 郁闷都没人顶下 动力啊 ....55555
具体的建造者
java 代码
- package zmo;
-
- public class GoldBuilder extends Builder
- {
-
-
- private Food goldFood=null;
- public GoldBuilder()
- {
- this.goldFood=new Food();
- }
-
- @Override
- public void BuildChip()
- {
- goldFood.Add("GoldChip", "5.00");
- }
-
- @Override
- public void BuildCoke()
- {
- goldFood.Add("CokeCole", "5.00");
- }
-
- @Override
- public void BuildHamb()
- {
- goldFood.Add("GoldHamb", "13.50");
- }
-
- @Override
- public Food GetFood()
- {
- return goldFood;
- }
-
- }
java 代码
- package zmo;
-
- public class NormalBuilder extends Builder
- {
-
-
- private Food normalFood=null;
- public NormalBuilder()
- {
- normalFood=new Food();
- }
-
- @Override
- public void BuildChip()
- {
-
- normalFood.Add("FireChips", "2.00");
- }
-
- @Override
- public void BuildCoke()
- {
-
- normalFood.Add("cokecole", "5.00");
- }
-
- @Override
- public void BuildHamb()
- {
-
- normalFood.Add("NormalHamb", "1.00");
- }
-
- @Override
- public Food GetFood()
- {
- return normalFood;
- }
-
- }
java 代码
- package zmo;
-
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.util.ResourceBundle;
-
-
- public class Client
- {
-
-
-
-
-
- public static void main(String[] args)
- {
- FoodManager foodmanager = new FoodManager();
- Builder instance;
-
- String configFile="food";
- ResourceBundle bundle = ResourceBundle.getBundle(configFile);
- String No="";
- do
- {
- System.out.println(bundle.getString("List"));
- No =inputString();
- }while(No.equals("")||No==null);
- String foodType = bundle.getString("No"+No);
-
-
- try
- {
- instance = (Builder) Class.forName(foodType).newInstance();
- foodmanager.Construct(instance);
- Food food=instance.GetFood();
- food.Show();
- }
- catch (InstantiationException e)
- {
- e.printStackTrace();
- }
- catch (IllegalAccessException e)
- {
- e.printStackTrace();
- }
- catch (ClassNotFoundException e)
- {
- e.printStackTrace();
- }
-
- }
-
-
-
-
- private static String inputString()
- {
- BufferedReader bufferedreader = new BufferedReader(
- new InputStreamReader(System.in));
- String s = null;
- try
- {
-
- s = bufferedreader.readLine();
-
- } catch (IOException ioexception)
- {
- ioexception.printStackTrace();
- }
- return s;
- }
- }
food.properties文件放在src下其内容
List=1.Normal \n2.Gold \nPlease input the noumber
No1=zmo.NormalBuilder
No2=zmo.GoldBuilder
javastudy 你要的uml在附件的项目里面 我已经生成了uml 欢迎大家讨论 最后附上源代码
追加说明:
实现要点
1、建造者模式主要用于“分步骤构建一个复杂的对象”,在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化。
2、产品不需要抽象类,特别是由于创建对象的算法复杂而导致使用此模式的情况下或者此模式应用于产品的生成过程,其最终结果可能差异很大,不大可能提炼出一个抽象产品类。
3、创建者中的创建子部件的接口方法不是抽象方法而是空方法,不进行任何操作,具体的创建者只需要覆盖需要的方法就可以,但是这也不是绝对的,特别是类似文本转换这种情况下,缺省的方法将输入原封不动的输出是合理的缺省操作。
4、前面我们说过的抽象工厂模式(Abtract Factory)解决“系列对象”的需求变化,Builder模式解决“对象部分”的需求变化,建造者模式常和组合模式(Composite Pattern)结合使用。
效果
1、建造者模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节。
2、每一个Builder都相对独立,而与其它的Builder无关。
3、可使对构造过程更加精细控制。
4、将构建代码和表示代码分开。
5、建造者模式的缺点在于难于应付“分步骤构建算法”的需求变动。
适用性
以下情况应当使用建造者模式:
1、需要生成的产品对象有复杂的内部结构。
2、需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
3、 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。
应用场景
1、 根据properties文件或者class文件来知道builder
2、 .......
总结
建造者模式的实质是解耦组装过程和创建具体部件,使得我们不用去关心每个部件是如何组装的。
分享到:
相关推荐
java设计模式------------------------------------建造者模式
代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法...建造者模式(Builder Pattern)、桥梁模式(Bridge Pattern)、命令模式(Command Pattern)、装饰模式(Decorator Pattern)、迭代器模式...
Java设计模式-建造者模式详解 Java设计模式-建造者模式详解将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。生成器模式(Builder)是使用多个“小型”工厂来最终创建出一个完整对象。...
java常用设计模式-建造者模式 -java常用设计模式-建造者模式是java中的一种创建型设计模式,它允许开发者通过一步一步地构建复杂对象来创建不同类型的对象。 建造者模式的定义 建造者模式是一种创建型设计模式,...
JAVA-设计模式-创建型模式-建造者模式
这个资源"Java设计模式----通俗易懂版"显然是一个专门针对初学者或需要深入理解设计模式的开发者编写的指南。作者以形象生动的例子解释了23种经典的Java设计模式,使得复杂的概念变得更加易于理解。 首先,我们要...
建造者模式是一种软件设计模式,属于创建型模式之一,主要用于解决创建复杂对象的问题。在实际应用中,当对象的构造过程过于复杂,涉及到多个属性或者子对象的组合时,直接通过构造函数创建可能会导致代码混乱、难以...
设计模式之---建造模式 1,建造模式属于对象的创建模式,是将一个产品的内部表象和产品的生产分割出来 2.使用原因:为了将构建复杂对象的过程和它的不见解耦; 3 使用情况:建造模式利用一个导演着对象和一个具体...
创建型设计模式如单例(Singleton)、工厂方法(Factory Method)、抽象工厂(Abstract Factory)、建造者(Builder)和原型(Prototype),它们主要关注对象的创建过程,使得代码更加灵活且易于扩展。 结构型设计...
建造者模式,是Java设计模式中的重要组成部分,它在软件工程中扮演着构造复杂对象的角色。这个模式的主要目的是将对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。通过使用建造者模式,我们可以...
建造者模式(Builder)是Java设计模式中的一种创建型模式,它允许我们分步骤构建复杂的对象,而无需暴露其构造过程。在Android开发中,这种模式尤其有用,因为Android组件如Activity、Fragment等的初始化过程通常...
建造者模式是一种结构型设计模式,它允许我们分步骤创建复杂对象,而无需暴露构建过程的内部细节。这种模式在Java编程中非常常见,尤其是在处理需要多种构建方式或需要隔离对象构造过程的场景。 建造者模式的核心...
### Java设计模式详解 #### 创建型模式 **1.1 工厂方法(Factory Method)** 工厂方法模式定义了一个创建对象的接口,但允许子类决定实例化哪一个类。这使得一个类的实例化可以被推迟到其子类。这种模式在以下...
- **建造者模式**:将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。 - **单例模式**:保证一个类仅有一个实例,并提供一个全局访问点。 - **原型模式**:通过复制已有对象来创建新对象,...
Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决问题的经验总结,可以提高代码的可读性、可维护性和可扩展性。本压缩包包含的源代码涵盖了多个经典的设计模式,接下来将对这些模式进行详细介绍。 1....
Java设计模式是软件开发中的一种最佳实践,它们是解决常见问题的经验总结,旨在提高代码的可重用性、可维护性和可扩展性。本篇Java设计模式(疯狂Java联盟版)详细介绍了二十三种设计模式,包括创建型、结构型和行为...
在Java编程中,建造者模式通常包括四个主要角色: 1. **产品类(Product)**:这是要创建的对象,通常具有多个属性,如复杂的对象结构。 2. **具体产品类(Concrete Product)**:实现产品类接口或抽象类的具体产品...
建造者模式(Builder Pattern)是一种创建型设计模式,它提供了一种方法来分步骤构建复杂的对象,使得构建过程和表示分离,使得同样的构建过程可以创建不同的表示。这种模式经常在对象的构造过程中需要进行多种选择...
java设计模式【之】建造者模式【源码】【场景:车辆组装】 将复杂的对象构建,与对象的使用进行分离 用户只需要通过简单流程即可创建出对象 方法调用顺序,步骤的不同实现 优点:封装性号,创建和使用分离,扩展性...
在本设计模式课程设计中,我们重点探讨了五个核心的设计模式:原型模式、单例模式、抽象工厂模式、代理模式和建造者模式。这些模式在Java编程中具有广泛的应用,能够帮助开发者创建更加灵活、可扩展和易于维护的代码...