定义:

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

结构:(书中图,侵删)

一个产品类
一个指定产品各个部件的抽象创建接口
若干个实现了各个部件的具体实现的创建类
一个指挥者,用于控制具体的创建过程,包含一个抽象创建接口的引用
 

实例:

书中使用了游戏中创建人物的例子,人都有头、四肢、躯干这些固定组成部分,但是高矮胖瘦各不相同。
我瞬间就想到了捏脸系统,虽然说捏脸系统把人物的各种细节都交给了用户设置,细节到嘴唇的弧度都可以用户调节。
但实际上创建过程还是固定不变的,用户只需要将调整好的参数发送给系统,并不需要知道系统创建时是先“安”的头,还是先“安”的脚。
出于尽量不和书中举一样的例子,充分活跃大脑,举一反三的目的,我还得再想个别的例子。(其实还是没有跳脱出去,说到底既然是建造者模式就是造东西,想了半天也都是在想能造个什么其他的东西当例子。)
那就组装个电脑吧。
台式机一般都有主机、显示器、键盘、鼠标。
电脑类(产品类):
package designpattern.builder;

public class Computer {
public String computerCase;
public String monitor;
public String keyboard;
public String mouse; public String getComputerCase() {
return computerCase;
} public void setComputerCase(String computerCase) {
this.computerCase = computerCase;
} public String getMonitor() {
return monitor;
} public void setMonitor(String monitor) {
this.monitor = monitor;
} public String getKeyboard() {
return keyboard;
} public void setKeyboard(String keyboard) {
this.keyboard = keyboard;
} public String getMouse() {
return mouse;
} public void setMouse(String mouse) {
this.mouse = mouse;
} @Override
public String toString() {
return "Computer [computerCase=" + computerCase + ", monitor=" + monitor + ", keyboard=" + keyboard + ", mouse="
+ mouse + "]";
} }
抽象建造者接口:
package designpattern.builder;

public interface ComputerBuilder {
void assembleComputerCase(Computer computer);// 组装主机 void assembleMonitor(Computer computer);// 组装显示器 void assembleKeyboard(Computer computer);// 组装键盘 void assembleMouse(Computer computer);// 组装显示器
}
具体建造者类:
游戏型电脑建造者类:
package designpattern.builder;

public class GameComputerBuilder implements ComputerBuilder {
@Override
public void assembleComputerCase(Computer computer) {
computer.setComputerCase("水冷机箱");
} @Override
public void assembleMonitor(Computer computer) {
computer.setMonitor("4k显示器");
} @Override
public void assembleKeyboard(Computer computer) {
computer.setKeyboard("机械键盘");
} @Override
public void assembleMouse(Computer computer) {
computer.setMouse("人体工学鼠标");
} }
娱乐型电脑建造者类:
package designpattern.builder;

public class AmusementComputerBuilder implements ComputerBuilder {

    @Override
public void assembleComputerCase(Computer computer) {
computer.setComputerCase("普通机箱");
} @Override
public void assembleMonitor(Computer computer) {
computer.setMonitor("普通显示器");
} @Override
public void assembleKeyboard(Computer computer) {
computer.setKeyboard("普通键盘");
} @Override
public void assembleMouse(Computer computer) {
computer.setMouse("普通鼠标");
} }
指挥者类:

package designpattern.builder;

public class ComputerBuilderDirect {

    public void assembleComputer(ComputerBuilder computerBuilder, Computer computer) {
computerBuilder.assembleComputerCase(computer);
computerBuilder.assembleMonitor(computer);
computerBuilder.assembleKeyboard(computer);
computerBuilder.assembleMouse(computer);
} // 或者写成下面这样?可能具体情况具体分析吧 public Computer assembleComputer(ComputerBuilder computerBuilder) {
Computer computer = new Computer();
computerBuilder.assembleComputerCase(computer);
computerBuilder.assembleMonitor(computer);
computerBuilder.assembleKeyboard(computer);
computerBuilder.assembleMouse(computer);
return computer;
}
}
客户端:

package designpattern.builder;

public class Client {
public static void main(String[] args) {
ComputerBuilderDirect computerBuilderDirect = new ComputerBuilderDirect();
// 组装游戏型电脑
Computer gameComputer = new Computer();
computerBuilderDirect.assembleComputer(new GameComputerBuilder(), gameComputer);
System.out.println("游戏型电脑:");
System.out.println(gameComputer);
// 组装普通娱乐型电脑
Computer assembleComputer = new Computer();
computerBuilderDirect.assembleComputer(new AmusementComputerBuilder(), assembleComputer);
System.out.println("普通娱乐型电脑:");
System.out.println(assembleComputer);
}
}
 结果输出:
游戏型电脑:
Computer [computerCase=水冷机箱, monitor=4k显示器, keyboard=机械键盘, mouse=人体工学鼠标]
普通娱乐型电脑:
Computer [computerCase=普通机箱, monitor=普通显示器, keyboard=普通键盘, mouse=普通鼠标]

总结:

这个设计模式在一个大体构建过程一致,构建过程的具体细节不同的对象创建时,可以使用。
首先是可以保证同类对象的构建过程一致,其次是分离客户端和具体实现,同样满足迪米特/最少知识法则。
 

设计模式 | 建造者模式/生成器模式(builder)的更多相关文章

  1. 设计模式(4)建造者模式/生成器模式(Builder)

    设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 设计模式(2)工厂方法模式(Factory Method) 设计模式(3)抽象工厂模式(Abstract Factory) 源 ...

  2. 设计模式 — 建造者(生成器)模式(Builder)

    考虑这样一种业务场景,我们构建一个业务对象,但是这个业务对象及其复杂.为了代码的根号的可读性,我们会把这个对象的构建过程根据精密联系的程度来拆分成几个类来完成.最后再放到一起使用来生成复杂对象.这个业 ...

  3. Java设计模式之建造者模式(生成器模式)

    建造者模式: 也叫生成器模式.用来隐藏复合对象的创建过程,他把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象. 总结一句就是封装一个对象的构造过程,并允许按步骤构造 ...

  4. 设计模式——建造者模式/生成器模式(C++实现)

    #include <iostream> #include <string> using namespace std; class STProduct { public: voi ...

  5. 1.6建造者模式(生成器模式) Builder

    1.概念:将一个复杂对象的构建和他的表示分离,使得同样的构件可以创建不同的表示. 2.实例:肯德基和中餐,肯德基抽象了整个做菜的复杂过程(相同的构建),然后在不同的店铺进行实现(不同的表示).中餐往往 ...

  6. 【设计模式】- 生成器模式(Builder)

    生成器模式 建造者模式.Builder 生成器模式 也叫建造者模式,可以理解成可以分步骤创建一个复杂的对象.在该模式中允许你使用相同的创建代码生成不同类型和形式的对象. 生成器的结构模式 生成器(Bu ...

  7. 设计模式十: 生成器模式(Builder Pattern)

    简介 生成器模式属于创建型模式的一种, 又叫建造者模式. 生成器模式涉及4个关键角色:产品(Product),抽象生成器(builder),具体生成器(ConcreteBuilder),指挥者(Dir ...

  8. C#设计模式——生成器模式(Builder Pattern)

    一.概述在软件系统中,有时候面临着复杂的对象创建,该对象由一定算法构成的子对象组成,由于需求变化,这些子对象会经常变换,但组合在一起的算法却是稳定的.生成器模式可以处理这类对象的构建,它提供了一种封装 ...

  9. Java 设计模式系列(四)生成器模式

    Java 设计模式系列(四)生成器模式 生成器模式也称之为建造者模式.将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.demo 1. 生成器模式原理 1.1 生成器模式结构 ...

随机推荐

  1. 如何书写一篇能看懂的html和CSS代码

    在书写html和CSS过程中,如果只是想要实现网页的外观和基本功能,那么简单的书写代码就可以满足需求,甚至不需要使用类名或者注释等.但实际上,这么写肯定是不行的,首先对于类同结构的重复书写就是一件很浪 ...

  2. Python_回调函数

    import os import stat def remove_readonly(func,path): #定义回调函数 os.chmod(path,stat.S_IWRITE) #删除文件的只读文 ...

  3. Linux Ubuntu 16.04 初次安装使用总结zzz

    装了两天的ubuntu系统终于算是勉强能用了,来来回回装了有三四次,期间出了各种各样的毛病.但是还是被我的Google大法给治好了.为了装这个系统,算是耗了两天的时间,啥事情都没干,干耗在这上面了.所 ...

  4. Spring Boot实战笔记(七)-- Spring高级话题(计划任务)

    一.计划任务 从Spring3.1开始,计划任务在Spring中的实现变得异常的简单.首先通过在配置类注解@EnableScheduling来开启对计划任务的支持,然后在执行计划任务的方法上注解@Sc ...

  5. Unity3D学习(二):使用JSON进行对象数据的存储读取

    前言 前段时间完成了自己的小游戏Konster的制作,今天重新又看了下代码.原先对关卡解锁数据的存储时用了Unity自带的PlayerPref(字典式存储数据). 读取关卡数据的代码: void Aw ...

  6. PAT1049:Counting Ones

    1049. Counting Ones (30) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The tas ...

  7. PAT1043:Is It a Binary Search Tree

    1043. Is It a Binary Search Tree (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN ...

  8. 了解mysqlpump工具

    Ⅰ.功能分析 1.1 多线程介绍 mysqlpump是MySQL5.7的官方工具,用于取代mysqldump,其参数与mysqldump基本一样 mysqlpump是多线程备份,但只能到表级别,单表备 ...

  9. SVN汉化教程2017.10.6

    https://jingyan.baidu.com/album/b87fe19e95f5925219356853.html?picindex=4

  10. 第三天 Java语言基础

    一.三元运算符 三元运算符,也称为三目运算符或问号冒号运算符.即有三个表达式参与的运算表达式.既然是个运算符,那么运算完必须有运算结果. 1)三元运算符的格式 (表达式1)?表达式2:表达式3: 2) ...