设计模式之Build(生成者模式)

简介:

一、生成器模式的定义:

生成器模式也称为建造者模式。生成器模式的意图在于将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示(GoF)。在软件设计中,有时候面临着一个非常复杂的对象的创建工作。这个复杂的对象通常可以分成几个较小的部分,由各个子对象组合出这个复杂对象的过程相对来说比较稳定,但是子对象的创建过程各不相同并且可能面临变化。根据OOD中的OCP原则,应该对这些子对象的创建过程进行变化封装。

二、生成模式的类结构图:

builer模式中主要有两个角色,一个是builder(相当于底层的建筑工人),一个是director(相当于设计师)。builder负责提供构建对象各个部分的功能以及最后组装对象的功能,而director负责调用builder的功能来创建对象。

Builder:为创建Product对象的各个部件指定抽象接口。

ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。

Director:构造一个使用Builer接口的对象。

Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,以及将这些部件装配成最终产品的接口。

 

三、代码示例

假设要组装一辆自行车,并且自行车就是车轮和车架组成。

Builder对应于组装自行车所使用的车轮和车架

ConcreteBuiler对应于自行车的车轮和车架,同时可以返回一辆自行车。

Product对应于自行车。

Director表示组装过程。

此时我们再来理解下面这句话:“在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法确相对稳定。”

自行车就是“一个复杂对象”,它有车轮和车架组成,但不管车轮和车架这两个部件怎么变化,生产一辆自行车的过程是不会变的,即组装过程是不会变的。

下面是Java示例代码:

 

[java]  view plain  copy
 
  1. /** 
  2.  * A bike as a concrete product we got finally 
  3.  * 
  4.  */  
  5. public class Bike {  
  6.     //自行车车架数量  
  7.     int frameNumber;  
  8.     //自行车轮子数量  
  9.     int wheelNumber;  
  10.     public Bike(){  
  11.         frameNumber = 1;  
  12.         wheelNumber = 4;  
  13.     }  
  14.     public int getFrameNumber() {  
  15.         return frameNumber;  
  16.     }  
  17.       
  18.     public int getWheelNumber() {  
  19.         return wheelNumber;  
  20.     }  
  21.       
  22. }  

 

 

 

[java]  view plain  copy
 
  1. /** 
  2.  *  
  3.  * An abstract Builder 
  4.  */  
  5. public abstract class BikeBuilder {  
  6.     //构建bike的框架  
  7.     public abstract void BuildFrame(int frameNumber);  
  8.     //构建bike的轮子  
  9.     public abstract void BuildWheels(int wheelNumber);  
  10.     //获取构建好的完整的产品  
  11.     public abstract Bike getBike();  
  12. }  

 

[java]  view plain  copy
 
  1. /** 
  2.  *  
  3.  *构建自行车的各个部件 
  4.  */  
  5. public class ConcreteBikeBuilder extends BikeBuilder {  
  6.     Bike  bike;  
  7.     public ConcreteBikeBuilder(){  
  8.         bike = new Bike();  
  9.     }  
  10.     @Override  
  11.     public void BuildFrame(int frameNumber) {  
  12.         bike.frameNumber = frameNumber;  
  13.     }  
  14.   
  15.     @Override  
  16.     public void BuildWheels(int wheelNumber) {  
  17.         bike.wheelNumber = wheelNumber;  
  18.     }  
  19.   
  20.     @Override  
  21.     public Bike getBike() {  
  22.           
  23.         return bike;  
  24.     }  
  25.   
  26. }  

 

 

 

[java]  view plain  copy
 
  1. /** 
  2.  *  
  3.  *组装自行车 
  4.  */  
  5. public class BikeDirector {  
  6.    public void createBike(BikeBuilder concreteBuilder){  
  7.        concreteBuilder.BuildFrame(1);  
  8.        concreteBuilder.BuildWheels(4);  
  9.    }  
  10. }  

 

 

 

[java]  view plain  copy
 
  1. public class TestClient {  
  2.   
  3.     public static void main(String[] args) {  
  4.         Bike bike = new Bike();  
  5.         BikeBuilder  builder = new ConcreteBikeBuilder();  
  6.         BikeDirector director = new BikeDirector();  
  7.         director.createBike(builder);  
  8.         bike = builder.getBike();  
  9.         System.out.println("车架frame:" + bike.getFrameNumber()+"个");  
  10.         System.out.println("轮子wheel:" + bike.getWheelNumber()+"个");  
  11.     }  
  12. }  


测试结果:

 

 

[java]  view plain  copy
 
  1. 车架frame:1个  
  2. 轮子wheel:4个  

 

四、优点和缺点

优点如下:

1、将一个复杂对象的创建过程封装起来。

2、解耦了组装过程和创建具体部件,使得我们不用去关心每个部件是如何组装的。--上面对自行车的分析可以很清楚的看出这点。

3、向客户隐藏产品内部的表现。

4、产品的实现可以被替换,因为客户只看到一个抽象的接口。

缺点如下:

1、经常被用来创建组合结构。

五、适用性

1、需要生成的产品对象有复杂的内部结构。
2、需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
3、在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。

 

六、实现要点

1、建造者模式主要用于“分步骤构建一个复杂的对象”,在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化。

2、产品不需要抽象类,特别是由于创建对象的算法复杂而导致使用此模式的情况下或者此模式应用于产品的生成过程,其最终结果可能差异很大,不大可能提炼出一个抽象产品类。
3、创建者中的创建子部件的接口方法不是抽象方法而是空方法,不进行任何操作,具体的创建者只需要覆盖需要的方法就可以,但是这也不是绝对的,特别是类似文本转换这种情况下,缺省的方法将输入原封不动的输出是合理的缺省操作。

4、前面我们说过的抽象工厂模式(AbtractFactory)解决“系列对象”的需求变化,Builder模式解决“对象部分”的需求变化,建造者模式常和组合模式(Composite Pattern)结合使用。



本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/6350327.html,如需转载请自行联系原作者

相关文章
|
18天前
|
设计模式 SQL 算法
设计模式了解哪些,模版模式
设计模式了解哪些,模版模式
19 0
|
1月前
|
设计模式 Java uml
C++设计模式之 依赖注入模式探索
C++设计模式之 依赖注入模式探索
37 0
|
3月前
|
设计模式 存储 算法
Java 设计模式最佳实践:三、行为模式
Java 设计模式最佳实践:三、行为模式
22 0
|
3月前
|
设计模式 Go 开发工具
Golang设计模式——12中介模式
Golang设计模式——12中介模式
26 0
|
2月前
|
设计模式 前端开发 JavaScript
观察者模式 vs 发布-订阅模式:两种设计模式的对决!
欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚开始学习前端的读者们打造的。无论你是初学者还是有一些基础的开发者,我们都会在这里为你提供一个系统而又亲切的学习平台。我们以问答形式更新,为大家呈现精选的前端知识点和最佳实践。通过深入浅出的解释概念,并提供实际案例和练习,让你逐步建立起一个扎实的基础。无论是HTML、CSS、JavaScript还是最新的前端框架和工具,我们都将为你提供丰富的内容和实用技巧,帮助你更好地理解并运用前端开发中的各种技术。
|
14天前
|
设计模式 Java 数据库
小谈设计模式(2)—简单工厂模式
小谈设计模式(2)—简单工厂模式
|
2天前
|
设计模式 存储 JavaScript
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式
|
2天前
|
设计模式 Java Go
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
|
4天前
|
设计模式
设计模式(一)简单工厂模式
设计模式(一)简单工厂模式
13 0
|
14天前
|
设计模式 Java
小谈设计模式(9)—工厂方法模式
小谈设计模式(9)—工厂方法模式