- 建造者模式(Builder Pattern)
- 使用多个简单的对象一步一步构建成一个复杂的对象,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
- 允许用户只通过指定复杂对象的类型和内容就可以构建它们,不需要知道内部的具体构建细节
- 场景举例
- KFC创建套餐:套餐是一个复杂对象,它一般包含主食如汉堡、烤翅等和饮料 如果汁、 可乐等组成部分,不同的套餐有不同的组合,而KFC的服务员可以根据顾客的要求,一步一步装配这些组成部分,构造一份完整的套餐
电脑有低配、高配,组装需要CPU、内存、电源、硬盘、主板等
- 核心组成
- Builder:抽象建造者,定义多个通用方法和构建方法
- ConcreteBuilder:具体建造者,可以有多个
- Director:指挥者,控制整个组合过程,将需求交给建造者,由建造者去创建对象
- Product:产品角色
编码实践(同个设计模式 包括博文、书籍等不会完全相同,大体思想一致就行)老规矩,先看结构图
public class Main { public static void main(String[] args) { Director director = new Director(); Computer lowComputer = director.craete(new LowComputerBuilder()); Computer highComputer = director.craete(new HighComputerBuilder()); System.out.println(lowComputer.toString()); System.out.println(highComputer.toString()); } }
/** * 声明了建造者的公共方法 */ public interface Builder { /** *细节方法 */ void buildCpu(); void buildMainboard(); void buildDisk(); void buildPower(); void buildMemory(); Computer createComputer(); }
public class Computer { private String cpu; private String memory; private String mainboard; private String disk; private String power; @Override public String toString() { return "Computer{" + "cpu='" + cpu + '\'' + ", memory='" + memory + '\'' + ", mainboard='" + mainboard + '\'' + ", disk='" + disk + '\'' + ", power='" + power + '\'' + '}'; } public String getCpu() { return cpu; } public void setCpu(String cpu) { this.cpu = cpu; } public String getMemory() { return memory; } public void setMemory(String memory) { this.memory = memory; } public String getMainboard() { return mainboard; } public void setMainboard(String mainboard) { this.mainboard = mainboard; } public String getDisk() { return disk; } public void setDisk(String disk) { this.disk = disk; } public String getPower() { return power; } public void setPower(String power) { this.power = power; } }
/** * * * @Description 将产品和创建过程进行解耦,使用相同的创建过程创建不同的产品,控制产品生产过程 * Director是全程指导组装过程,具体的细节还是builder去操作 **/ public class Director { public Computer craete(Builder builder){ builder.buildMemory(); builder.buildCpu(); builder.buildMainboard(); builder.buildDisk(); builder.buildPower(); return builder.createComputer(); } }
/** * @Description 具体的建造者,实现builder来创建不同的产品 **/ public class HighComputerBuilder implements Builder{ private Computer computer = new Computer(); @Override public void buildCpu() { computer.setCpu("高配 CPU"); } @Override public void buildMainboard() { computer.setMainboard("高配 主板"); } @Override public void buildDisk() { computer.setDisk("高配 磁盘"); } @Override public void buildPower() { computer.setPower("高配 电源"); } @Override public void buildMemory() { computer.setMemory("高配 内存"); } @Override public Computer createComputer() { return computer; } }
/** * @Description 具体的建造者,实现builder来创建不同的产品 **/ public class LowComputerBuilder implements Builder{ private Computer computer = new Computer(); @Override public void buildCpu() { computer.setCpu("低配 CPU"); } @Override public void buildMainboard() { computer.setMainboard("低配 主板"); } @Override public void buildDisk() { computer.setDisk("低配 磁盘"); } @Override public void buildPower() { computer.setPower("低配 电源"); } @Override public void buildMemory() { computer.setMemory("低配 内存"); } @Override public Computer createComputer() { return computer; } }
控制台输出
- 优点
- 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦
- 每一个具体建造者都相对独立,而与其他的具体建造者无关,更加精细地控制产品的创建过程
- 增加新的具体建造者无须修改原有类库的代码,符合开闭原则
- 建造者模式结合链式编程来使用,代码上更加美观
- 缺点
- 建造者模式所创建的产品一般具有较多的共同点,如果产品差异大则不建议使用
- JDK里面的应用
- tcp传输协议 protobuf 生成的api、java中的StringBuilder(不完全一样,思想一样)
- 建造者模式与抽象工厂模式的比较:
- 建造者模式返回一个组装好的完整产品 , 抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族
本文作者为DBC,转载请注明。