1.建造者模式概念
- 建造者模式(builder Pattern)
- 使用多个简单的对象一步一步构建成一个复杂的对象,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
- 允许用户只通过制定复杂对象的类型和内容就可以构建它们,不需要知道内部的具体构建细节
- 核心组成
- Builder:抽象建造者,定义多个通用方法和构建方法
- ConcreteBuilder:具体建造者,可以有多个
- Director:指挥者,控制整个组合过程,将需求交给建造者,由建造者去创建对象
- Product:产品角色
2.代码编写
-
代码示例,以组装电脑为例子
java/** * 具体产品 */ class Computer { private String cpu; private String memory; 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; } @Override public String toString() { return "Computer{" + "cpu='" + cpu + '\'' + ", memory='" + memory + '\'' + '}'; } } /** * 声明了建造者的公共方法 */ interface Builder { void buildCpu(); void buildMemory(); Computer createComputer(); } /** * 具体的建造者,实现builder来创建不同的产品 * 低配电脑 */ class LowComputerBuilder implements Builder { private Computer computer = new Computer(); @Override public void buildCpu() { computer.setCpu("低配 CPU"); } @Override public void buildMemory() { computer.setMemory("低配 内存"); } @Override public Computer createComputer() { return computer; } } /** * 具体的建造者,实现builder来创建不同的产品 * 高配电脑 */ class HighComputerBuilder implements Builder { private Computer computer = new Computer(); @Override public void buildCpu() { computer.setCpu("高配 CPU"); } @Override public void buildMemory() { computer.setMemory("高配 内存"); } @Override public Computer createComputer() { return computer; } } /** * 将产品和创建过程进行解耦,使用相同的创建过程创建不同的产品,控制产品生产过程 * Director是全程指导组装过程,具体的细节还是builder去操作 */ class Director { public Computer build(Builder builder) { builder.buildCpu(); builder.buildMemory(); return builder.createComputer(); } } public class Main { public static void main(String[] args) throws CloneNotSupportedException { Director director = new Director(); Computer lowComputer = director.build(new LowComputerBuilder()); Computer highComputer = director.build(new HighComputerBuilder()); System.out.println(lowComputer); System.out.println(highComputer); } }
-
优点
- 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦
- 每一个具体建造者都相对独立,而与其他的具体建造者无关,更加精细地控制产品的创建过程
- 增加新的具体建造者无需修改原有类库的代码,符合开闭原则
- 建造者模式结合链式编程来使用,代码上更加美观
-
缺点
- 建造者模式所创建的产品一般具有较多的共同点,如果产品差异大则不建议使用
-
建造者模式与抽象工厂模式的比较
- 建造者模式返回一个组装好的完整产品
- 抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族