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. [fiddler的使用]模拟自动回复功能在模拟测试mock第三方对接系统的返回中的使用场景

    [场景描述]在许多对第三方的测试过程中,由于第三方没有测试环境或者测试环境同步开发的时候还未准备好,或者系统间联调时对方还未完成的各种情况下,我们可以通过fiddler来模拟对方的返回. [操作步骤] ...

  2. 使用idea从零编写SpringCloud项目-zuul

    带着问题学习是最好的,什么是网关?使用网关的好处是什么?怎么使用网关 网关:是系统对外的唯一入口,是介于客户端和服务端的中间层,处理非业务功能,提供路由的请求,鉴权,监控,缓存,限流等 网关的好处:可 ...

  3. vscode设置终端主题,设置终端选中颜色

    vscode定义主题色官网: https://code.visualstudio.com/api/references/theme-color#integrated-terminal-colors 问 ...

  4. Kafka源码阅读系列——Producer

    Producer Kafka源码的exmaple模块有一个Producer类,继承了Thread类,构造方法会指定topic,是否异步,是否幂等,配置Kafka集群信息,初始化一个KafkaProdu ...

  5. GFF2GTF.py2

    import sys inFile = open(sys.argv[1],'r') for line in inFile: #skip comment lines that start with th ...

  6. C语言和C++的区别与联系(详细)

    文章转自:https://blog.csdn.net/cherrydreamsover/article/details/81835976 在学习了C语言和C++之后,这两者之间的区别我们需要仔细的捋一 ...

  7. 小程序使用svga

     svga 是一种动画格式.不仅可以在 ios,android,flutter,web 上使用,小程序也支持.设计师使用 after effects 或是 animate 进行动画设计.设计师导出工具 ...

  8. 求pi

    参考自:https://www.zhihu.com/question/402311979 由 \[\frac{\pi^4}{90}={\textstyle \sum_{n=1}^{\infty }} ...

  9. python:m3u8转mp4

    import re,requests,time,os import threadpool res = requests.get(url="http://pili-vod.tebaobao.v ...

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

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