建造者模式 (Builder Pattern) 使用多个简单的对象一步一步构建成一个复杂的对象. 这种类型的设计模式属于创建型模式, 它提供了一种创建对象的最佳方式. 将一个复杂的构建与其表示相分离, 使得同样的构建过程可以创建不同的表示.
优点
建造者独立, 易扩展.
便于控制细节风险.
缺点
产品必须有共同点, 范围有限制.
如内部变化复杂, 会有很多的建造类.
角色介绍
建造者模式有四个角色:
Product(产品类)
: 要建造的对象
builder(抽象建造者)
: 规范建造对象的组成成分, 但不具体创建.
ConcreteBuilder(具体建造者)
: 根据抽象建造者规范的组成成分来具体创建, 并返回建造对象 (产品类) 实例.
Director(指导者)
: 调用具体建造者来建造各个部分, 指导者只需要关注建造顺序, 而不需要关注各成分 (产品类属性) 具体信息.
执行顺序: Director->builder->ConcreteBuilder 最后返回 Product
产品类
要建造的对象
- public class Phone {
- /**
- * 处理器
- */
- private String CPU;
- /**
- * 屏幕
- */
- private String screen;
- /**
- * 相机
- */
- private String camera;
- getter and setter...
抽象建造者
规范建造对象的组成成分, 但不具体创建.
- public interface PhoneBuilder {
- void buildScreen();
- void buildCpu();
- void buildCamera();
- Phone buildPhone();
- }
具体建造者
根据抽象建造者规范的组成成分来具体创建, 并返回建造对象 (产品类) 实例.
- public class ConcreteBuilder implements PhoneBuilder{
- public Phone phone;
- public ConcreteBuilder() {
- phone = new Phone();
- }
- @Override
- public void buildScreen() {
- phone.setScreen("三星 OLED 屏幕");
- }
- @Override
- public void buildCpu() {
- phone.setCpu("骁龙 845");
- }
- @Override
- public void buildCamera() {
- phone.setCamera("SONY");
- }
- @Override
- public Phone buildPhone() {
- return this.phone;
- }
- }
指导者
调用具体建造者来建造各个部分, 指导者只需要关注建造顺序, 而不需要关注各成分 (产品类属性) 具体信息.
- public class Direct {
- public Phone constructMi8(PhoneBuilder phoneBuilder){
- phoneBuilder.buildCamera();
- phoneBuilder.buildCpu();
- phoneBuilder.buildScreen();
- return phoneBuilder.buildPhone();
- }
- }
测试
- public class Main {
- public static void main(String[] args) {
- Direct direct = new Direct();
- Phone phone = direct.constructMi8(new ConcreteBuilder());
- System.out.println(phone);
- }
- }
Phone{CPU='骁龙 845', screen='三星 OLED 屏幕', camera='SONY'}
与抽象工厂模式区别
建造者模式和抽象工厂模式是很像的(都是创建产品类实例), 建造者模式比它多了一个指导者的角色, 所以它们的最大区别在于:
建造者模式只需要关注产品类建造的顺序, 而不需要关注其具体信息.
而抽象工厂模式需要关注其具体信息去创建产品类.
抽象工厂模式顺风车: 设计模式快速学习 (二) 抽象工厂模式 https://www.jianshu.com/p/35141aed2afb
来源: https://juejin.im/post/5c34b4fae51d4551eb3a0e4d