设计模式创建型——建造者模式

📅 2026/8/22 12:06:07
设计模式创建型——建造者模式
目录什么是建造者模式建造者模式的实现建造者模式的角色建造者模式类图建造者模式代码实现建造者模式的特点优点缺点应用场景注意事项什么是建造者模式建造者模式Builder Pattern又叫生成器模式使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式它提供了一种创建对象的最佳方式。一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。在一些基本部件不会变而其组合经常变化的时候一般会使用到建造者模式。主要解决在软件系统中有时候面临着一个复杂对象的创建工作其通常由各个部分的子对象用一定的算法构成由于需求的变化这个复杂对象的各个部分经常面临着剧烈的变化但是将它们组合在一起的算法却相对稳定。建造者模式的实现建造者模式的角色产品角色Product包含多个组成部件的复杂对象由具体建造者来创建其各个组成部件。抽象建造者Builder是一个包含创建产品各个子部件的抽象方法的接口通常还包含一个返回复杂产品的方法getResult()。规范具体建造者的方法是多个规范相同的具体建造者的抽象。具体建造者Concrete Builder实现Builder接口完成复杂产品的各个部件的具体创建方法定义并明确它所创建的表示并提供一个检索产品的接口。指挥者Director它调用建造者对象中的部件构造与装配方法完成复杂对象的创建在指挥者中不涉及具体产品的信息。建造者模式类图建造者模式代码实现产品角色Product/** * author Evan Walker 昂焱数据: https://www.ayshuju.com * version 1.0 * desc 汽车产品角色 * date 2023/04/20 10:26:33 */ public class Car { /** * 引擎 */ private String engine; /** * 底盘 */ private String chassis; /** * 变速箱 */ private String transmissionCase; /** * 轮胎 */ private String tire; public String getEngine() { return engine; } public void setEngine(String engine) { this.engine engine; } public String getChassis() { return chassis; } public void setChassis(String chassis) { this.chassis chassis; } public String getTransmissionCase() { return transmissionCase; } public void setTransmissionCase(String transmissionCase) { this.transmissionCase transmissionCase; } public String getTire() { return tire; } public void setTire(String tire) { this.tire tire; } Override public String toString() { return Car{ engine engine \ , chassis chassis \ , transmissionCase transmissionCase \ , tire tire \ }; } }抽象建造者Builder/** * author Evan Walker 昂焱数据: https://www.ayshuju.com * version 1.0 * desc 抽象建造者 * date 2023/04/20 10:33:55 */ public abstract class AbstractCarBuilder { private Car car new Car(); abstract void builderEngine(); abstract void builderChassis(); abstract void builderTransmissionCase(); abstract void builderTire(); public Car getCar() { return car; } }具体建造者Concrete Builder/** * author Evan Walker 昂焱数据: https://www.ayshuju.com * version 1.0 * desc 奔驰汽车建造者 * date 2023/04/20 10:37:43 */ public class BenzCarBuilder extends AbstractCarBuilder { Override void builderEngine() { super.getCar().setEngine(奔驰发动机); } Override void builderChassis() { super.getCar().setChassis(奔驰底盘); } Override void builderTransmissionCase() { super.getCar().setTransmissionCase(奔驰变速箱); } Override void builderTire() { super.getCar().setTire(奔驰轮胎); } Override public Car getCar() { return super.getCar(); } } /** * author Evan Walker 昂焱数据: https://www.ayshuju.com * version 1.0 * desc 宝马汽车建造者 * date 2023/04/20 10:37:43 */ public class BMWCarBuilder extends AbstractCarBuilder { Override void builderEngine() { super.getCar().setEngine(宝马发动机); } Override void builderChassis() { super.getCar().setChassis(宝马底盘); } Override void builderTransmissionCase() { super.getCar().setTransmissionCase(宝马变速箱); } Override void builderTire() { super.getCar().setTire(宝马轮胎); } Override public Car getCar() { return super.getCar(); } }指挥者Director/** * author Evan Walker 昂焱数据: https://www.ayshuju.com * version 1.0 * desc 指挥者 汽车组装者 * date 2023/04/20 10:44:22 */ public class CarManager { private AbstractCarBuilder carBuilder; public CarManager(AbstractCarBuilder carBuilder) { this.carBuilder carBuilder; } /** * 组装汽车 * return Car */ public Car builderCar(){ carBuilder.builderEngine(); carBuilder.builderChassis(); carBuilder.builderTransmissionCase(); carBuilder.builderTire(); return this.carBuilder.getCar(); } }测试/** * author Evan Walker * version 1.0 * desc 构建者测试类 * date 2023/04/20 10:48:41 */ public class BuilderTest { public static void main(String[] args) { //构造宝马汽车 BMWCarBuilder bMWCarBuilder new BMWCarBuilder(); CarManager carManager new CarManager(bMWCarBuilder); System.out.println(carManager.builderCar().toString()); //构造奔驰汽车 BenzCarBuilder benzCarBuilder new BenzCarBuilder(); CarManager carManager1 new CarManager(benzCarBuilder); System.out.println(carManager1.builderCar().toString()); } }StringBuilder中也使用的建造者模式有兴趣的小伙伴可以阅读下源码此处只添加了类图建造者模式的特点优点易于解耦客户端不需要知道内部的具体构建细节将产品本身与创建过程进行解耦允许用户只通过指定复杂对象的类型和内容就构建对象使用相同的创建过程来得到不同的产品符合依赖倒转原则易于精准控制对象的创建将复杂产品的创建步骤分解在不同的方法中使得创建过程更加清晰易于扩展增加新的具体构建者无需修改原有的代码易于扩展符合开闭原则缺点产品必须有共同点范围有限制其组成部分相似适用建造者模式产品差异性很大时不适合使用建造者模式其使用范围受到一定的限制。如内部变化复杂会有很多的建造类导致系统变得庞大。应用场景需要生成的产品对象有复杂的内部结构这些产品对象具备共性隔离复杂对象的创建和使用并使得相同的创建过程可以创建不同的产品需要生成的对象内部属性本身相互依赖注意事项抽象工厂模式实现对产品家族的创建一个产品家族是一系列产品具有不同分类维度的产品组合采用抽象工厂模式不需要关心构建过程只关心什么产品由什么工厂生产即可。建造者模式要求按照指定的规范建造产品主要目的是通过组装零配件而产生一个新产品。与工厂模式的区别是建造者模式更加关注与零件装配的顺序。