建造者模式:将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
核心思想:通过分步构建对象,避免构造函数参数过多,提高代码的可读性和灵活性。
假设你正在开发一个电脑定制系统,用户可以根据自己的需求选择不同的硬件配置(如CPU、内存、硬盘、显卡等)。电脑的配置组合非常复杂,如果使用传统的构造函数或Setter方法,会导致代码冗长且难以维护。建造者模式可以很好地解决这个问题。
1. 产品类 (Computer
)
public class Computer { private String cpu; private String memory; private String storage; private String gpu; public void setCpu(String cpu) { this.cpu = cpu; } public void setMemory(String memory) { this.memory = memory; } public void setStorage(String storage) { this.storage = storage; } public void setGpu(String gpu) { this.gpu = gpu; } @Override public String toString() { return "Computer{" + "cpu='" + cpu + '\'' + ", memory='" + memory + '\'' + ", storage='" + storage + '\'' + ", gpu='" + gpu + '\'' + '}'; } }
2. 建造者接口 (ComputerBuilder
)
public interface ComputerBuilder { void buildCpu(); void buildMemory(); void buildStorage(); void buildGpu(); Computer getComputer(); }
3. 具体建造者 (GamingComputerBuilder
, OfficeComputerBuilder
)
游戏电脑建造者
public class GamingComputerBuilder implements ComputerBuilder { private Computer computer; public GamingComputerBuilder() { this.computer = new Computer(); } @Override public void buildCpu() { computer.setCpu("Intel i9"); } @Override public void buildMemory() { computer.setMemory("32GB DDR5"); } @Override public void buildStorage() { computer.setStorage("1TB SSD"); } @Override public void buildGpu() { computer.setGpu("NVIDIA RTX 4090"); } @Override public Computer getComputer() { return computer; } }
办公电脑建造者
public class OfficeComputerBuilder implements ComputerBuilder { private Computer computer; public OfficeComputerBuilder() { this.computer = new Computer(); } @Override public void buildCpu() { computer.setCpu("Intel i5"); } @Override public void buildMemory() { computer.setMemory("16GB DDR4"); } @Override public void buildStorage() { computer.setStorage("512GB SSD"); } @Override public void buildGpu() { computer.setGpu("Integrated GPU"); } @Override public Computer getComputer() { return computer; } }
4. 指挥者 (ComputerDirector
)
public class ComputerDirector { private ComputerBuilder computerBuilder; public ComputerDirector(ComputerBuilder computerBuilder) { this.computerBuilder = computerBuilder; } public void constructComputer() { computerBuilder.buildCpu(); computerBuilder.buildMemory(); computerBuilder.buildStorage(); computerBuilder.buildGpu(); } public Computer getComputer() { return computerBuilder.getComputer(); } }
5. 客户端代码
public class ComputerBuilderDemo { public static void main(String[] args) { // 创建游戏电脑 ComputerBuilder gamingBuilder = new GamingComputerBuilder(); ComputerDirector gamingDirector = new ComputerDirector(gamingBuilder); gamingDirector.constructComputer(); Computer gamingComputer = gamingDirector.getComputer(); System.out.println("游戏电脑配置: " + gamingComputer); // 创建办公电脑 ComputerBuilder officeBuilder = new OfficeComputerBuilder(); ComputerDirector officeDirector = new ComputerDirector(officeBuilder); officeDirector.constructComputer(); Computer officeComputer = officeDirector.getComputer(); System.out.println("办公电脑配置: " + officeComputer); } }
6. 输出
游戏电脑配置: Computer{cpu='Intel i9', memory='32GB DDR5', storage='1TB SSD', gpu='NVIDIA RTX 4090'} 办公电脑配置: Computer{cpu='Intel i5', memory='16GB DDR4', storage='512GB SSD', gpu='Integrated GPU'}
业务场景总结
问题:电脑配置复杂,直接使用构造函数或Setter方法会导致代码冗长且难以维护。
解决方案:使用建造者模式,将电脑的构建过程分解为多个步骤,并通过指挥者统一管理。
优点:
分离构建过程与表示,代码更清晰。
支持灵活扩展,新增配置类型只需增加新的建造者。
避免构造函数参数过多,提高代码可读性。
其他业务场景
订餐系统:用户可以选择不同的菜品组合(如主食、饮料、甜点),建造者模式用于构建订单。
文档生成:生成复杂的文档(如PDF、Word),建造者模式用于分步构建文档内容。
车辆制造:汽车的不同配置(如发动机、轮胎、内饰),建造者模式用于构建车辆对象。
建造者模式的核心思想是分步构建复杂对象,适用于需要灵活创建对象的场景。