【建造者设计模式详解】Java/JS/Go/Python/TS不同语言实现
简介
建造者模式(Builder Pattern),也叫生成器模式,属于创建型模式。它使用多个简单的对象一步一步构建成一个复杂的对象。它允许你使用相同的创建代码生成不同类型和形式的对象。
当你希望使用代码创建不同形式的产品 (例如各种商品和订单) 时, 一些基本部件不会变,而其组合经常变化的时候,就可以考虑建造者模式。
作用
- 当需要创建复杂对象的时候,由各个部分的子对象来逐步构建,以适应复杂多变的情况。
- 具体的建造者类之间是相互独立的,这有利于系统的扩展。
- 将变与不变分离开。主管类隐藏了产品构造细节, 客户端只需要将一个生成器与主管类关联,就能从生成器处构造对象。
实现步骤
- 定义主管类,可以制造所有形式的产品。
- 在基本生成器接口中声明创建产品的步骤。
- 为每个形式的产品创建具体生成器类,并实现其构造步骤。
- 客户端同时创建生成器和主管类,所有产品都遵循相同的接口,构造结果通过主管类获取。
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不同语言实现的更多相关文章
- [ 转载 ] Java开发中的23种设计模式详解(转)
Java开发中的23种设计模式详解(转) 设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类 ...
- android java 设计模式详解 Demo
android java 设计模式详解 最近看了一篇设计模式的文章,深得体会,在此基础我将每种设计模式的案例都写成Demo的形式,方便读者研究学习, 首先先将文章分享给大家: 设计模式(Design ...
- Java温故而知新(5)设计模式详解(23种)
一.设计模式的理解 刚开始“不懂”为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“简单”就是一把钥匙开一把锁的模式,目 ...
- JAVA设计模式简介及六种常见设计模式详解
一.什么是设计模式 ...
- Javascript设计模式详解
Javascript常用的设计模式详解 阅读目录 一:理解工厂模式 二:理解单体模式 三:理解模块模式 四:理解代理模式 五:理解职责链模式 六:命令模式的理解: 七:模板方法模式 八:理解javas ...
- Protocol Buffer技术详解(Java实例)
Protocol Buffer技术详解(Java实例) 该篇Blog和上一篇(C++实例)基本相同,只是面向于我们团队中的Java工程师,毕竟我们项目的前端部分是基于Android开发的,而且我们研发 ...
- Javascript常用的设计模式详解
Javascript常用的设计模式详解 阅读目录 一:理解工厂模式 二:理解单体模式 三:理解模块模式 四:理解代理模式 五:理解职责链模式 六:命令模式的理解: 七:模板方法模式 八:理解javas ...
- javascript设计模式详解之策略模式
接上篇命令模式来继续看下js设计模式中另一种常用的模式,策略模式.策略模式也是js开发中常用的一种实例,不要被这么略显深邃的名字给迷惑了.接下来我们慢慢看一下. 一.基本概念与使用场景: 基本概念:定 ...
- 16个PHP设计模式详解
说明:该教程全部截选自实验楼教程[16个PHP设计模式详解]:主要介绍16个常用的设计模式的基础概念和技术要点,通过UML类图帮助理解设计模式中各个类之间的关联关系,针对每种设计模式都使用PHP完成了 ...
- 详解java动态代理机制以及使用场景
详解java动态代理机制以及使用场景 https://blog.csdn.net/u011784767/article/details/78281384 深入理解java动态代理的实现机制 https ...
随机推荐
- cmd执行程序时容易卡住阻塞以及解决方式
遇到问题: cmd执行程序时总是卡住,敲回车后继续执行程序. 我司公众号需要去内网获取数据,cmd执行了内网穿透程序,期间cmd两次卡住,公众号无法获取内网数据导致无法运行. 解决方案: cmd默认开 ...
- Excel—时间函数
时间函数,学习之前先普及一个尝试,微软采用的是1900年纪念方式(数字1,代表的是1900年1月1日,数字1.5 代表的是1900年的1月1日的中午12:00,因为1.5正好是1天半的时间,而一天2 ...
- kvm介绍(1)
- 【七侠传】冲刺阶段--Day7
[七侠传]冲刺阶段--Day7 团队成员 20181221曾宇涛 20181202李祎铭 20181209沙桐 20181215薛胜瀚 20181216杨越麒 20181223何家豪 20181232 ...
- C++入门之unordered_map
1.介绍 unordered_map是c++语言STL库中一个比较重要的容器,不能自动排序,这一容器是根据哈希表这一数据结构设计而成的,能够极大地提升数据搜索.插入和删除操作的时间效率. 2.头文 ...
- 21 forms组件-参数initial&instance应用
简单来讲: 如果你想传入前端的页面中附带值,那么在实例化forms中: form = SecondModelForm(data=request.POST, instance=permission_ob ...
- hive:使用concat_ws实现 array转string案例
concat_ws(',',collect_set(if(step_name <> '',step_name,null))) AS step_names,
- hdu4585 Treap与名次树/STL map(C/C++)
hdu4585 题目地址:https://acm.dingbacode.com/showproblem.php?pid=4585 Shaolin Time Limit: 3000/1000 MS (J ...
- AutoCAD2018_64bit
「AutoCAD_2018_Simplified_...hinese_Win_64bit」https://www.aliyundrive.com/s/eiLscbxkMui 点击链接保存,或者复制本段 ...
- AXI4_LITE总线vivado2019.1官方模板源码(verilog实现)
AXI lite总线读写时序 1. AXI_SLAVE源码 `timescale 1 ns / 1 ps module myip_v1_0_S00_AXI # ( // Users to add pa ...