8 建造者模式

8.1 建造者模式概述

Builder Pattern:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式可以将部件本身和它们的组装过程分开,关注如何一步一步地创建一个包含多个组成部分的复杂对象,用户只需指定复杂对象的类型即可得到该对象,而无须知道其内部的具体构造细节。

建造者模式结构图如下:

8.2 建造者模式实现

8.2.1 抽象建造者类

public abstract class Builder {
protected Product product = new Product(); public abstract void buildPartA();
public abstract void buildPartB();
public abstract void buildPartC(); // 返回产品对象
public Product getProduct() {
return product;
}
}

8.2.2 具体建造者类

public class ConcreteBuilder extends Builder {
public void buildPartA(PartA partA) {
product.setPartA(partA);
} public void buildPartB(PartB partB) {
product.setPartB(partB);
} public void buildPartC(PartC partC) {
product.setPartB(partC);
}
}

8.2.3 具体产品类

public class Product {
private PartA partA;
private PartB partB;
private PartC partC; /**
* get and set methods
*/
}

8.2.4 指挥者类

引入该类主要有两个作用:

  • 隔离了客户端与创建过程
  • 控制产品对象的创建过程
public class Director {
private Builder builder; public Director(Builder builder) {
this.builder = builder;
} public void setBuilder(Builder builder) {
this.builder = builder;
} public Product construct() {
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
return builder.getProduct();
}
}

8.2.5 客户端调用

对于客户端而言,只需要关注具体建造者的类型,无须关心产品对象的具体创建过程。

public class Client {
Builder builder = new ConcreteBuilder();
Director director = new Director(builder);
Product product = director.construct();
}

8.3 指挥者类的变化形式

指挥者类是建造者模式的重要组成部分,简单的 Director 类用于指导具体创建如何创建产品,它按一定顺序调用 Builder 中的各个方法,控制先后顺序,并向客户端返回一个完整的产品对象。

8.3.1 省略指挥者类

为了简化系统结构,某些情况下可以将指挥者类和抽象建造者类进行合并,在 Builder 中提供构建复杂产品对象的 construct() 方法。由于 Builder 通常为抽象类,无法直接实例化,因此可以将 construct() 方法定义为静态方法,以便客户端可以直接调用。

public abstract class Builder {
protected static Product product = new Product(); public abstract void buildPartA();
public abstract void buildPartB();
public abstract void buildPartC(); // 返回产品对象
public static Product construct(Builder builder) {
builder.buildPartA();
builder.buildPartB();
builder.buildPartC(); return product;
}
} // 客户端调用
public class Client {
Builder builder = new ConcreteBuilder();
Product product = Builder.construct(builder);
}

由于静态变量是被所有实例所共享的,在内存中只有一个副本,因此上述方法只能创建一个 Product 对象。可以做如下改进:

public abstract class Builder {
protected Product product = new Product(); public abstract void buildPartA();
public abstract void buildPartB();
public abstract void buildPartC(); // 返回产品对象
public Product construct() {
this.buildPartA();
this.buildPartB();
this.buildPartC(); return product;
}
} // 客户端调用
Builder builder = new ConcreteBuilder();
Product product = builder.construct();

以上两种方法对 Director 类的省略方式都不影响系统的灵活性和扩展性,同时还简化了系统结构,但是加重了抽象建造者类的职责。如果 construct() 方法较为复杂,待构建产品组成较多,还是应该不省略指挥者类

8.3.2 钩子方法

建造者模式可以通过 Director 类更加精细的控制产品的创建过程,例如增加一类钩子方法来控制是需要对某个 buildPartX() 方法进行调用。

public abstract class Builder {
protected Product product = new Product(); public abstract void buildPartA();
public abstract void buildPartB();
public abstract void buildPartC(); // 钩子方法, 子类可以覆盖该方法
public boolean isBuildPartA() {
return false;
} public Product construct() {
return product;
}
}
public class Director {
public Product construct(Builder builder) {
if (builder.isBuildPartA()) {
builder.buildPartA();
}
builder.buildPartB();
builder.buildPartC(); Product product = builder.construct();
return product;
}
}

8.4 建造者模式优/缺点

建造者模式优点主要如下:

  • 客户端无须知道产品内存的创建细节,将产品本身与创建过程解耦,使得相同的创建过程可以创建不同的产品对象
  • 每一个具体的建造者都相对独立,与其他具体建造者无关,可以很方便的增加或删除具体建造者
  • 更加精细地控制产品的创建过程,将复杂产品的创建步骤分解在不同的方法中

建造者模式缺点主要如下:

  • 如果产品的内部变化复杂,可能会导致需要定义很多具体的建造者类来实现这种变化,导致系统很庞大

Java设计模式 —— 建造者模式的更多相关文章

  1. 3.java设计模式-建造者模式

    Java设计模式-建造者模式 在<JAVA与模式>一书中开头是这样描述建造(Builder)模式的: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal repr ...

  2. 我的Java设计模式-建造者模式

    在未上大学之前,一直有个梦想"I have a dream!",就是能成为一位汽车工程师,一直幻想着开着自己设计的汽车飞奔在公路上,迷倒了万千少女.咳咳~~虽然现在没实现我的dre ...

  3. java设计模式——建造者模式

    一. 定义与类型 定义:将一个复杂对象的构建与它的表示分离,使用同样的构建过程可以创建不同的表示 用户只需制定需要建造的类型就可以得到它们,建造过程以及细节不需要知道 类型:创建型 建造者模式与工厂模 ...

  4. Java设计模式-建造者模式(Builder)

    将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. [构建与表示分离,同构建不同表示] 与抽象工厂的区别:在建造者模式里,有个指导者,由指导者来管理建造者,用户是与指导者联系的,指 ...

  5. Java设计模式——建造者模式(创建型模式)

    概述   建造者模式也称为生成器模式,是一种对象创建型模式,它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象.   建造者模式意在为重叠构造 ...

  6. Java设计模式--------建造者模式(Builder模式)

    Builder模式定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构 ...

  7. java设计模式------建造者模式

    建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 类图 描述 Builder:定义一个建造者抽象类,以规范产品对象的各个组成部分的建造.这个接口 ...

  8. Java设计模式—建造者模式

    建造模式:        将一个复杂的对象的构建与它的表示分离,使得同样的构建 过程可以创建不同的. 建造模式表示是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内 ...

  9. 设计模式—建造者模式(Builder)

    title: 设计模式-建造者模式 建造者模式(Builder)是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节.建造者模式属于对 ...

  10. Java设计模式——组合模式

    JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...

随机推荐

  1. JAVA 作业

    1.让用户分2次输入2个整数,输出2个数的最大值,最小值 import java.util.Scanner;class Demo01 { public static void main(String[ ...

  2. maya灯光导入houdini插件开发——技术文档

    如果想了解插件开发流程的话,可以参考我另外一篇文章maya灯光导入houdini插件开发 插件下载地址 接下来我将说明怎么使用这插件(因为之前写过技术文档,所以也懒得再写一份了,直接照搬上来) 1.插 ...

  3. MMDetection中模型的Checkpoints下载

    mmdetection中的模型checkpoints是需要自己手动下载的,下载步骤如下: 打开mmdetection, 进入configs目录,可以看到这里面有很多以目标检测模型命名的文件夹,选择你想 ...

  4. 正向代理和反向代理和spring的动态代理模式有几种?默认是那种?如何切换?

    spring的动态代理模式有几种?默认是那种?如何切换? spring的动态的代理模式有两种 JDK动态代理,基于接口(默认代理模式),CGLIB动态代理(若要使用需要进行配置) JDK动态代理是由j ...

  5. python C# DES 加密转换

    import time import base64 import pyDes import binascii def DESEncrypt(desKey, target): key = desKey[ ...

  6. celery工作原理和代码

    1.celery介绍 pip install celery == 4.4.7 pip install redis == 3.5.3 pip install eventlet == 0.26.1 Cel ...

  7. Oracle表主键作为外键都用在哪些表查询

    Oracle中,如果设置了外键,删除数据时,必须将外键关联一并删除,但是如果对项目不是很熟悉时,我们无法判断到底都在哪些表中有外键关联,以下提供了一个查询的SQL,可以通过数据库查询,查找到所有的外键 ...

  8. AssetBuddle(一)

    一·含义 一个压缩文件,针对于特定平台的资产压缩包.资产包括模型,贴图,预制体,音效,材质球等,注意不包括c#脚本. 二·作用 相对于resource文件夹下面的东西打包后定死只读,无法修改. AB包 ...

  9. pip第三方库安装失败原因及解决办法

    pip安装三方库失败原因及解决方法 提示:WARNING: You are using pip version 20.2.3, however version 20.2.4 is available. ...

  10. 非常有用的python单行代码

    1 推导式应用 1.1 列表推导式(一行for循环) #For循环在一行 mylist = [200, 300, 400, 500] #正常方式 result = [] for x in mylist ...