设计模式之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,如需转载请自行联系原作者

相关文章
|
4月前
|
设计模式 Java 数据库连接
【设计模式】【创建型模式】工厂方法模式(Factory Methods)
一、入门 什么是工厂方法模式? 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪个类。工厂方法模式使类的实例化延迟
116 16
|
4月前
|
设计模式 负载均衡 监控
并发设计模式实战系列(2):领导者/追随者模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第二章领导者/追随者(Leader/Followers)模式,废话不多说直接开始~
122 0
|
4月前
|
设计模式 监控 Java
并发设计模式实战系列(1):半同步/半异步模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第一章半同步/半异步(Half-Sync/Half-Async)模式,废话不多说直接开始~
95 0
|
4月前
|
设计模式 安全 Java
并发设计模式实战系列(12):不变模式(Immutable Object)
🌟 大家好,我是摘星!🌟今天为大家带来的是并发设计模式实战系列,第十二章,废话不多说直接开始~
85 0
|
4月前
|
设计模式 算法 Java
设计模式觉醒系列(04)策略模式|简单工厂模式的升级版
本文介绍了简单工厂模式与策略模式的概念及其融合实践。简单工厂模式用于对象创建,通过隐藏实现细节简化代码;策略模式关注行为封装与切换,支持动态替换算法,增强灵活性。两者结合形成“策略工厂”,既简化对象创建又保持低耦合。文章通过支付案例演示了模式的应用,并强调实际开发中应根据需求选择合适的设计模式,避免生搬硬套。最后推荐了JVM调优、并发编程等技术专题,助力开发者提升技能。
|
9月前
|
设计模式 前端开发 搜索推荐
前端必须掌握的设计模式——模板模式
模板模式(Template Pattern)是一种行为型设计模式,父类定义固定流程和步骤顺序,子类通过继承并重写特定方法实现具体步骤。适用于具有固定结构或流程的场景,如组装汽车、包装礼物等。举例来说,公司年会节目征集时,蜘蛛侠定义了歌曲的四个步骤:前奏、主歌、副歌、结尾。金刚狼和绿巨人根据此模板设计各自的表演内容。通过抽象类定义通用逻辑,子类实现个性化行为,从而减少重复代码。模板模式还支持钩子方法,允许跳过某些步骤,增加灵活性。
461 11
|
10月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
4月前
|
设计模式 Prometheus 监控
并发设计模式实战系列(20):扇出/扇入模式(Fan-Out/Fan-In)(完结篇)
🌟 大家好,我是摘星!🌟今天为大家带来的是并发设计模式实战系列,第二十章,废话不多说直接开始~
133 0
|
12月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
6月前
|
设计模式 Java 关系型数据库
设计模式:工厂方法模式(Factory Method)
工厂方法模式是一种创建型设计模式,通过将对象的创建延迟到子类实现解耦。其核心是抽象工厂声明工厂方法返回抽象产品,具体工厂重写该方法返回具体产品实例。适用于动态扩展产品类型、复杂创建逻辑和框架设计等场景,如日志记录器、数据库连接池等。优点包括符合开闭原则、解耦客户端与具体产品;缺点是可能增加类数量和复杂度。典型应用如Java集合框架、Spring BeanFactory等。