开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第22天,点击查看活动详情
【设计模式】建造者模式
概念
将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。
代码演示
-
A
-
代码
class Computer { private String cpu; private String gpu; private String memory; //硬盘 private String hd; // set get tostring 省略 } public static void main(String[] args) { Computer computer = new Computer(); computer.setCpu("I5 8300H"); computer.setGpu("1050Ti"); computer.setMemory("16G"); computer.setHd("256固态"); System.out.println(computer); } -
分析
- 实例化好对象之后,必须为每一个属性赋值,太麻烦了。
- 违反了迪米特法则。用户买电脑不需要知道这么多参数。
-
-
B (增加一个构造电脑类ComputerBuilder)
-
代码
class ComputerBuilder{ private Computer computer = new Computer(); public Computer builder(){ computer.setCpu("I7 8750HK"); computer.setGpu("3060Ti"); computer.setMemory("32G"); computer.setHd("1T固态"); return computer; } } -
分析
-
优点
- 封装了创建对象的复杂过程
-
缺点
- 属性是固定的。
-
-
-
C
-
代码 (B包基础上新增代码 如下)
** * 中配 */ class MiddleComputerBuilder{ private Computer computer = new Computer(); public Computer builder(){ computer.setCpu("I7 7700HQ"); computer.setGpu("1060Ti"); computer.setMemory("16G"); computer.setHd("256固态"); return computer; } } /** * 低配 */ class LowComputerBuilder{ private Computer computer = new Computer(); public Computer builder(){ computer.setCpu("I5 7500U"); computer.setGpu("GTX960"); computer.setMemory("8G"); computer.setHd("128T固态"); return computer; } } -
分析
-
优点
- 根据不同的需求生产不同的产品
-
缺点
- 多个不同的建造者代码在重复 应该抽取出来
- 建造过程不稳定,如果在某个建造者创建产品的过程中漏掉了某一步,编译器不会报错
-
-
-
D 继续优化
-
代码 (C的基础上新增一个构造者接口 均实现该接口)
//构造者接口 interface ComputerBuilder{ public void setCpu(); public void setGpu(); public void setMemory(); public void setHd(); public Computer builder(); } /** * 高配 */ class AdvancedComputerBuilder implements ComputerBuilder{ private Computer computer = new Computer(); @Override public void setCpu() { computer.setCpu("I7 8750HK"); } @Override public void setGpu() { computer.setGpu("3060Ti"); } @Override public void setMemory() { computer.setMemory("32G"); } @Override public void setHd() { computer.setHd("1T固态"); } @Override public Computer builder() { return computer; } } public static void main(String[] args) { //打游戏 System.out.println(new AdvancedComputerBuilder().builder()); //开发 System.out.println(new MiddleComputerBuilder().builder()); //娱乐 System.out.println(new LowComputerBuilder().builder()); } -
分析
- 优点 : 解决了C包中的问题。建造过程是稳定的。
- 缺点: 用户建造之前需要手动调用多个set方法。
-
-
E (真正的建造者模式)
-
代码 D基础上新增
//指挥者 class Director{ //建造方法 public Computer builder(ComputerBuilder computerBuilder){ computerBuilder.setCpu(); computerBuilder.setGpu(); computerBuilder.setMemory(); computerBuilder.setHd(); return computerBuilder.builder(); } } public class Test { public static void main(String[] args) { //打游戏 System.out.println(new Director().builder(new AdvancedComputerBuilder())); //开发 System.out.println(new Director().builder(new MiddleComputerBuilder())); //娱乐 System.out.println(new Director().builder(new LowComputerBuilder())); } } -
UML图
-
分析
-
优点
- 建筑过程稳定,因为有接口。
- 创建对象的过程写了一次,没有重复代码
- 扩展时比较方便。不用修改之前的代码,符合开闭原则。
-
-
建造者与工厂模式
-
工厂模式
- 关注创建对象
-
建造者
- 关注建造对象之后的属性赋值问题。