简介

建造者模式(Builder Pattern),也叫生成器模式,属于创建型模式。它使用多个简单的对象一步一步构建成一个复杂的对象。它允许你使用相同的创建代码生成不同类型和形式的对象。

当你希望使用代码创建不同形式的产品 (例如各种商品和订单) 时, 一些基本部件不会变,而其组合经常变化的时候,就可以考虑建造者模式。

作用

  1. 当需要创建复杂对象的时候,由各个部分的子对象来逐步构建,以适应复杂多变的情况。
  2. 具体的建造者类之间是相互独立的,这有利于系统的扩展。
  3. 将变与不变分离开。主管类隐藏了产品构造细节, 客户端只需要将一个生成器与主管类关联,就能从生成器处构造对象。

实现步骤

  1. 定义主管类,可以制造所有形式的产品。
  2. 在基本生成器接口中声明创建产品的步骤。
  3. 为每个形式的产品创建具体生成器类,并实现其构造步骤。
  4. 客户端同时创建生成器和主管类,所有产品都遵循相同的接口,构造结果通过主管类获取。

UML

代码

创建建造者接口

// Builder.java 建造者接口,定义基本建造方法
public interface Builder {
public void reset();
public void setName(String name);
public void setScreen(Integer[] screen);
public void setGPU(Integer no);
}

具体建造者类,可以多个

// ManualBuilder.java 使用手册建造者类也实现了建造者接口
public class ManualBuilder implements Builder {
private Manual manual; public void reset() {
this.manual = new Manual();
} public void setName(String name) {
this.manual.setName(name);
} public void setScreen(Integer[] screen) {
this.manual.setScreen(screen);
} public void setGPU(Integer no) {
this.manual.setGpuType(no);
} public Manual getProduct() {
return this.manual;
}
} // PhoneBuilder.java 手机建造者实现了建造者接口
public class PhoneBuilder implements Builder {
private Phone phone; public void reset() {
this.phone = new Phone();
} public void setName(String name) {
this.phone.setName(name);
} public void setScreen(Integer[] screen) {
this.phone.setScreen(screen);
} public void setGPU(Integer no) {
this.phone.setGpuType(no);
} public Phone getProduct() {
return this.phone;
}
}

定义具体产品类,不同建造者建造不同产品

// Manual.java 手册产品类
public class Manual {
private String name = "PhoneManualName";
private Integer[] screen = { 0, 0 };
private Integer gpuType = 0;
private Integer pages = 0; public void setName(String name) {
this.name = name;
} public String getName() {
return this.name;
} public void setScreen(Integer[] screen) {
this.screen = screen;
} public Integer[] getScreen() {
return this.screen;
}
...... } // Phone.java 手机产品类
public class Phone {
private String name = "PhoneName";
private Integer[] screen = { 0, 0 };
private Integer gpuType = 0; public void setName(String name) {
this.name = name;
} public String getName() {
return this.name;
} public void setScreen(Integer[] screen) {
this.screen = screen;
} public Integer[] getScreen() {
return this.screen;
}
...... }

指挥调度类

// Director.java 指挥调度类,负责利用建造者建造产品,隔离需求与功能
public class Director { // 建造phone1
public void buildIPhone(Builder builder) {
builder.reset();
Integer[] screen = { 120, 500 };
builder.setName("iPhone");
builder.setScreen(screen);
builder.setGPU(100);
} // 建造phone2
public void buildHuaweiPhone(Builder builder) {
builder.reset();
Integer[] screen = { 130, 600 };
builder.setName("HuaweiPhone");
builder.setScreen(screen);
builder.setGPU(102);
} // 建造phone3
public void buildMiPhone(Builder builder) {
builder.reset();
Integer[] screen = { 120, 650 };
builder.setName("MiPhone");
builder.setScreen(screen);
builder.setGPU(103);
} }

测试调用

    /**
* 建造者模式是使用多个简单的对象一步一步构建出一个复杂的对象来。
* 分为主管类和建造这类,主管类负责具体指挥调度,建造负责具体实施。
* 主管类通过一步一步调用各种建造者实现复杂对象。
*/ // 声明指挥者
Director director = new Director();
// 创建手机
PhoneBuilder phoneBuilder = new PhoneBuilder();
director.buildMiPhone(phoneBuilder);
Phone miPhone = phoneBuilder.getProduct();
System.out.println("miPhone:" + miPhone.getName() + " | " + miPhone.getGpuType().toString());
// 创建手册
ManualBuilder manualBuilder = new ManualBuilder();
director.buildMiPhone(manualBuilder);
Manual manual = manualBuilder.getProduct();
System.out.println("manual:" + manual.getName() + " | " + manual.getGpuType().toString());

更多语言版本

不同语言实现设计模式:https://github.com/microwind/design-pattern

【建造者设计模式详解】Java/JS/Go/Python/TS不同语言实现的更多相关文章

  1. [ 转载 ] Java开发中的23种设计模式详解(转)

    Java开发中的23种设计模式详解(转)   设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类 ...

  2. android java 设计模式详解 Demo

    android java 设计模式详解 最近看了一篇设计模式的文章,深得体会,在此基础我将每种设计模式的案例都写成Demo的形式,方便读者研究学习, 首先先将文章分享给大家: 设计模式(Design ...

  3. Java温故而知新(5)设计模式详解(23种)

    一.设计模式的理解 刚开始“不懂”为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“简单”就是一把钥匙开一把锁的模式,目 ...

  4. JAVA设计模式简介及六种常见设计模式详解

    一.什么是设计模式                                                                                           ...

  5. Javascript设计模式详解

    Javascript常用的设计模式详解 阅读目录 一:理解工厂模式 二:理解单体模式 三:理解模块模式 四:理解代理模式 五:理解职责链模式 六:命令模式的理解: 七:模板方法模式 八:理解javas ...

  6. Protocol Buffer技术详解(Java实例)

    Protocol Buffer技术详解(Java实例) 该篇Blog和上一篇(C++实例)基本相同,只是面向于我们团队中的Java工程师,毕竟我们项目的前端部分是基于Android开发的,而且我们研发 ...

  7. Javascript常用的设计模式详解

    Javascript常用的设计模式详解 阅读目录 一:理解工厂模式 二:理解单体模式 三:理解模块模式 四:理解代理模式 五:理解职责链模式 六:命令模式的理解: 七:模板方法模式 八:理解javas ...

  8. javascript设计模式详解之策略模式

    接上篇命令模式来继续看下js设计模式中另一种常用的模式,策略模式.策略模式也是js开发中常用的一种实例,不要被这么略显深邃的名字给迷惑了.接下来我们慢慢看一下. 一.基本概念与使用场景: 基本概念:定 ...

  9. 16个PHP设计模式详解

    说明:该教程全部截选自实验楼教程[16个PHP设计模式详解]:主要介绍16个常用的设计模式的基础概念和技术要点,通过UML类图帮助理解设计模式中各个类之间的关联关系,针对每种设计模式都使用PHP完成了 ...

  10. 详解java动态代理机制以及使用场景

    详解java动态代理机制以及使用场景 https://blog.csdn.net/u011784767/article/details/78281384 深入理解java动态代理的实现机制 https ...

随机推荐

  1. 11 个Chrome骚技巧让你为所欲为

    1.曾经,在线调伪类样式困扰过你? 2.源代码快速定位到某一行 ctrl + p 3.联调接口失败时,后台老哥总管你要 response? 4.你还一层层展开 dom:Alt + Click 5.是不 ...

  2. 【ADB命令】安装app

    在电脑上安装以下指令 adb install app的文件位置

  3. web端测试的测试点和注意事项【转载】

    文章来源:作者:simplesally 出处:https://www.cnblogs.com/simple1025/   [转载] 工作中接触了不同类型的web端系统,内容不同,需求不同,测试关注点也 ...

  4. tensorflow2.0和之前版本读取模型的接口变化

    tensorflow2.0 c++加载模型可以用接口LoadSavedModel: SessionOptions opts;     tensorflow::RunOptions run_option ...

  5. git 报错 incorrect username or password

    如果报这个 就是用户名 或密码错误 添加个正确的凭据就好了

  6. Ubuntu系统update时提示源不安全被禁用的一种解决办法

    参考自这篇文章Ubuntu系统update时提示源不安全被禁用 - 知乎 (zhihu.com). 安装好Ubuntu18.04并更换清华源后,在运行 sudo apt update 更新源时报错如下 ...

  7. 1402:Vigenère密码

    [题目描述] 6世纪法国外交家Blaise de Vigenère设计了一种多表密码加密算法--Vigenère密码.Vigenère密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为 ...

  8. nodejs的框架koa

    koa:应用程序是一个包含一组中间件函数的对象,它是按照类似堆栈的方式组织和执行的 应用程序: 1.导入 const Koa = require('koa'); 2.创建koa的app实例 const ...

  9. window10下,命令行与端口

    netstat -ano 查看端口情况 tasklist|findstr "9220" 通过PID号"9220"查看对应端口被什么进程占用了 netstat - ...

  10. ybtoj 12F

    求值的话改为求解前缀和的值,通过两个前缀和相减即可得到每个值. 每次询问相当于给一个方程. 一共有 $n$ 个未知数,因此需要 $n$ 个方程,同时每个数都必须至少在方程中出现一次. 最小生成树求解即 ...