本文最后更新于 2025年7月24日 下午
建造者模式 是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
本质上建造者模式是向对象创建过程中加入了软件构建理念
Builder : 抽象层的建造者定义
ConcreteBuilder : 具体的产品创建过程,对应了软件中的执行过程。
Product : 具体的产品,对应了软件中的业务描述者
Director : 指挥建造者去建造目标,对应了软件中的执行器
优点
- 客户不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象
- 每一个具体建造者是独立的,因此可以方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象
- 可以更加精细地控制产品的创建过程,将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程
- 增加新的创建则,无需修改原有类库的代码,指挥者类针对建造者类编程,系统扩展方便
缺点
- 当建造者过多时,会产生很多类
- 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,若产品间差异过大,则不适合该模式
- 若产品内部变化复杂,可能需要定义很多具体建造者类来实现这种变化
创建建造者模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| public class Computer { private String cpu ; private String memory ; private String hardDisk ; private String keyboard ; private String mouse ; private String display ; 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 getHardDisk(){ return hardDisk; } public void setHardDisk(String hardDisk){ this.hardDisk = hardDisk ; } public String getKeyboard(){ return keyboard ; } public void setKeyboard(String keyboard){ this.keyboard = keyboard ; } public String getMouse(){ return mouse ; } public void setMouse(String mouse){ this.mouse = mouse ; } public String getDisplay(){ return display ; } public void setDisplay(String display){ this.display = display ; } @Override public String toString(){ return "Computer{" + "cpu=\\'"+ cpu + "\\',"+ "memory=\\'" + memory + "\\'," + "hardDisk=\\'" + hardDisk + "\\'," + "keyboard=\\'" + keyboard + "\\'," + "mouse=\\'" + mouse + "\\'," + "display=\\'" + display + "\\'," + '}'; }
}
|
1 2 3 4 5 6 7 8 9 10 11 12
| public interface ComputerConfigBuilder { void buildCpu(); void buildMemory(); void buildHardDisk(); void buildKeyboard(); void buildMouse(); void buildDisplay(); Computer build();
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| public class LowComputerConfigBuilder implements ComputerConfigBuilder{ private Computer computer = null; public LowComputerConfigBuilder(){ this.computer = new Computer(); }
@Override public void buildCpu(){ computer.setCpu("2核"); } @Override public void buildMemory(){ computer.setMemory("4GB"); } @Override public void buildHardDisk(){ computer.setHardDisk("20GB"); } @Override public void buildKeyboard(){ computer.setKeyboard("普通键盘"); } @Override public void buildMouse(){ computer.setMouse("普通鼠标"); } @Override public void buildDisplay(){ computer.setDisplay("普通显示器"); }
@Override public Computer build(){ return computer ; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| public class HighComputerConfigBuilder implements ComputerConfigBuilder{ private Computer computer = null; public HighComputerConfigBuilder(){ this.computer = new Computer(); }
@Override public void buildCpu(){ computer.setCpu("8核"); } @Override public void buildMemory(){ computer.setMemory("16GB"); } @Override public void buildHardDisk(){ computer.setHardDisk("500GB"); } @Override public void buildKeyboard(){ computer.setKeyboard("高端键盘"); } @Override public void buildMouse(){ computer.setMouse("高端鼠标"); } @Override public void buildDisplay(){ computer.setDisplay("高端显示器"); }
@Override public Computer build(){ return computer ; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public class Director{ private ComputerConfigBuilder builder ;
public void setBuilder(ComputerConfigBuilder builder){ this.builder = builder ; }
public void createComputer(){ builder.buildCpu(); builder.buildDisplay(); builder.buildHardDisk(); builder.buildKeyboard(); builder.buildMemory(); builder.buildMouse(); }
public Computer getComputer(){ return builder.build(); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class Customer{ public static void main(String[] args){ Director director = new Director(); director.setBuilder(new LowComputerConfigBuilder()); director.createComputer(); Computer computer = director.getComputer(); System.out.println("计算机配置:" + computer.toString()); } }
|
建造者模式通过将 对象定义,对象调用和对象的生命周期 托管给不同的类进行管理。这样可以灵活自由的对对象进行预配置,自定义配置和对象创建。
Java中的建造者模式
在java中一般通过私有类定义+暴露get/set方法来完成对配置类的预定义和自定义类配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| public class NutritionFacts { private final int servingSize ; private final int servings ; private final int calories ; private final int fat ; private final int sodium ; private final int carbohydrate ;
public static class Builder { private final int servingSize ; private final int servings ; private int calories = 0 ; private int fat = 0 ; private int sodium = 0 ; private int carbohydrate = 0 ; public Builder( int servingSize , int servings ){ this.servingSize = servingSize ; this.servings = servings ; } public Builder calories(int val){ calories = val ; return this ; } public Builder fat(int val){ fat = val ; return this ; } public Builder sodium(int val){ sodium = val ; return this ; } public Builder carbohydrate(int val){ carbohydrate = val ; return this ; } public NutritionFacts build(){ return new NutritionFacts(this); } } private NutritionFacts(Builder builder){ servingSize = builder.servingSize ; servings = builder.servings ; calories = builder.calories ; fat = builder.fat ; sodium = builder.sodium ; carbohydrate = builder.carbohydrate ; } }
|
Spring中的建造者模式应用
BeanDefinitionBuilder是用于构建Bean定义的构造器
1 2 3 4 5
| public final class BeanDefinitionBuilder{ public static BeanDefinitionBuilder genericBeanDefinition(){ return new BeanDefinitionBuilder(new GenericBeanDefinition()); } }
|
BeanDefinitionBuilder 提供了构建BeanDefinition对象的一系列方法,代码如下所示
1 2 3 4 5 6 7 8 9
| public BeanDefinitionBuilder setParentName(String parentName){ this.beanDefinition.setParentName(parentName); return this ; }
public BeanDefinitionBuilder setFactoryMethod(String factoryMethod){ this.beanDefinition.setFactoryMethodName(factoryMethod); return this ; }
|
总结
建造者模式不仅是经典的设计模式之一,更是现代软件系统中构建复杂对象的一种 工程化解耦思想 。通过抽象构建步骤、分离产品结构与构建过程,建造者模式可以大幅提升代码的清晰度、可维护性和扩展性。
在 Java 和 Spring 生态中,从 NutritionFacts 的静态 Builder 到 BeanDefinitionBuilder 的 API 构造方式,我们可以看到建造者模式已经深入各类框架与工具的底层设计,是真正值得掌握和理解的核心模式之一。