简介

建造者模式(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. vue3中使用vite-ts构建项目时tsconfig.json的配置

    在上一次创建vue3项目在tsconfig.json中配置了文件别名以后,格式校验提示 es3什么鬼,便去看了一下tsconfig.json的配置,以此学习 { "compilerOptio ...

  2. Qt的QString转换问题

    之前是写C#的,涉及类型转换要么是强转,类似(String)这样,要么是用Converter提供的转换方法,但是今天开发qt界面的时候,使用(QString)强转int类型的时候出现了乱码: 后来研究 ...

  3. Linux 服务器安全扫描

    工具一:Nmap 1. 探测网络中活跃的主机 nmap -sP 10.0.105.1/24 :探测10.0.105网段中的全部主机 2. 探测主机系统版本 nmap -O IP :探测指定IP的相关数 ...

  4. ES6的模块化(export导出)

    ES6 Module把一个文件当作一个模块,每个模块有自己的独立作用域,那如何把每个模块联系起来呢?核心点就是模块的导入(import)与导出(export). 模块化的好处: 防止命名冲突 代码复用 ...

  5. tomcat的安装以及环境配置

    1.Tomcat的下载地址:http://tomcat.apache.org/ Tomcat是开放源代码的WEB服务器,安装时,只需解压压缩包即可 2.环境变量的配置 1>新建系统变量CATAL ...

  6. Centos7.5下安装nginx

    #cd /usr/local #wget http://nginx.org/download/nginx-1.8.0.tar.gz #tar -xzvf nginx-1.8.0.tar.gz #cd ...

  7. flutter-android

    多端开发框架 含义:通过一套代码编译成在 H5/微信小程序/React Native/百度小程序/支付宝小程序等端运行的代码. 技术简介:Taro,uniapp Taro是一个开放式跨端跨框架解决方案 ...

  8. pandas、matplotlib常用命令(收集整理)

    1 import matplotlib.pyplot as plt 2 import pandas as pd 3 import matplotlib as mpl 含有中文无法正常显示,需增加如下代 ...

  9. LeetCode系列之 (JavaScript) => 66. 加一

    题目描述: 解题思路分析: 模拟十进制: 分析有几种情况,按情况来定 不同解法: /** * @param {number[]} digits * @return {number[]} */ // v ...

  10. egg框架学习笔记

    1.安装 npm i egg-init -g egg-init egg-example --type=simple cd egg-example yarn install npm run dev // ...