《Head First 设计模式》《设计模式之禅(第二版)》 学习笔记,码云同步更新中
如有错误或不足之处,请一定指出,谢谢~
目录
设计原则
- “依赖倒置”原则
- 未完待续...
设计模式
- 设计模式——策略模式
- 设计模式——装饰者模式
- 设计模式——观察者模式
- 设计模式——简单工厂
- 设计模式——工厂方法模式
- 设计模式——抽象工厂模式
- 设计模式——单例模式
- 设计模式——命令模式
- 设计模式——适配器模式
- 设计模式——门面模式(外观模式)
- 未完待续...
建造者模式(Builder Pattern)
定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
结构
- Product产品类:通常是实现了模板方法模式。
- Builder抽象建造者:规范产品的组建,一般是由子类实现。
- ConcreteBuilder具体建造者:实现抽象类定义的所有方法,并且返回一个组建好的对象。
- Director导演类:负责安排已有模块的顺序,然后告诉Builder开始建造
优点
- 封装性:使用建造者模式可以使客户端不必知道产品内部组成的细节。
- 建造者独立,容易扩展
- 便于控制细节风险:由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。
使用场景
- 相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。
- 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。
- 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适。
与工厂模式的区别
工厂方法的侧重点是创建,不关心组装顺序。而建造者模式主要是基本方法的调用顺序安排,是零件的装配。
示例
一台电脑主机由内存、cpu、显卡等部件组成。我想组装一台16G内存,i7处理器,1T硬盘的电脑,只需要告诉老板这些信息,老板安排小弟去组装,然后一手交钱一手拿货就好,完全不需要关心到底是怎么装起来的。 现在来模拟这个过程(参考了GsonBuilder的代码)
首先是电脑:
@Data
public class Computer {
public Computer(String mainBoard, String hardDisk, String memory, String cpu) {
this.mainBoard = mainBoard;
this.hardDisk = hardDisk;
this.memory = memory;
this.cpu = cpu;
}
/**
* 主板
*/
private String mainBoard;
/**
* 硬盘
*/
private String hardDisk;
/**
* 内存
*/
private String memory;
/**
* cpu
*/
private String cpu;
}
然后是组装电脑类ComputerBuilder
public class ComputerBuilder {
private String mainBoard = "默认主板";
private String hardDisk = "默认硬盘";
private String memory = "默认内存";
private String cpu = "默认cpu";
public ComputerBuilder installMainBoard(String mainBoard) {
this.mainBoard = mainBoard;
return this;
}
public ComputerBuilder installHardDisk(String hardDisk) {
this.hardDisk = hardDisk;
return this;
}
public ComputerBuilder installMemory(String memory) {
this.memory = memory;
return this;
}
public ComputerBuilder installCpu(String cpu) {
this.cpu = cpu;
return this;
}
public Computer create() {
return new Computer(mainBoard, hardDisk, memory, cpu);
}
}
然后来测试一下
public class Test {
public static void main(String[] args) {
// 没有定制需求,组装一台默认配置电脑
Computer computer1 = new ComputerBuilder().create();
System.out.println(computer1);
// 组装一台定制配置的电脑
Computer computer2 = new ComputerBuilder()
.installMainBoard("xxx主板")
.installCpu("intel 酷睿i7 xxx")
.installHardDisk("xxx牌 1T")
.installMemory("xxx 16G")
.create();
System.out.println(computer2);
}
}