1、简介
建造者模式(Builder pattern)是一种对象创建型模式,它可以将复杂对象的创建过程抽象出来,使得创建过程独立于对象的组成部分,从而可以得到相同类型的不同对象。
建造者模式通过分离了对象的构建和表示,使得同样的构建过程可以创建不同的表示,这样就可以得到多种不同的组合对象。
2、组成
建造者模式主要由四类角色组成:
①产品(Product)角色:它是被构造的复杂对象,包含多个组成部件。
②抽象建造者(Builder)角色:它是一个抽象类或者接口,规范了建造复杂对象的各个部分的构建。一般至少要有两个方法,一个是建造部件part1,一个是建造部件part2。
③具体建造者(Concrete Builder)角色:实现了抽象建造者的接口,构建和装配各个部件。
④指挥者(Director)角色:它负责安排复杂对象的建造次序,指导构建过程。它不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
3、Concrete Builder and Director
需要注意的是,具体建造者和指挥者可以不一定要都有,它们是可选的
建造者模式的具体建造者和指挥者不一定要都有,原因如下:
- 指挥者主要是用于规定构建对象的细节,如果对象构建过程简单,不需要细节控制,那么就没有必要提供指挥者。
- 具体建造者主要是实现构建对象的具体实现,如果具体实现已经确定,并且不需要其他变化,那么也没有必要提供具体建造者。
简单来说,在没有指挥者和具体建造者时,构建对象的过程是比较简单,而且不需要细节控制,所以不需要提供指挥者和具体建造者这两个角色。
4、优缺点
建造者模式具有以下优点:
①隔离了具体组装过程和最终产品,使得相同的构建过程可以创建不同的产品对象
②将构建的具体过程和组成部分解耦,可以独立的改变和扩展构建过程和组成部分
③每一个具体建造者都相对独立,而且是可扩展的,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象
缺点:
①需要了解所有产品类的组成,才能独立改变其中一部分
②产品的组成部分必须相对稳定,如果太多的改变会导致需要修改很多的建造者类
③不能很好的支持对于“part-of”的建造,比如在建造一个轮胎时,很难确定它是否需要装到车上
④如果产品类是最终产品类,那么每次改变都需要修改代码,这样不符合“开闭原则”
5、应用场景
建造者模式常见的应用场景是构建复杂对象,其中有很多组成部分需要组装,组装顺序可能有所不同。
创建的对象有多个部分组成,并且每个部分的类型和数量都可能不同。
创建对象的过程必须独立于对象的组成部分以及它们的装配方式。
在构建过程中会使用到一些重复的组件,构建过程允许创建不同的表示。
一些具体的例子:
电脑组装,创建电脑对象
建筑建造,创建房子对象
电子产品,创建手机对象
汽车制造,创建汽车对象等。
通过建造者模式可以使得创建复杂对象的过程变得简单化。因为它分离了具体的部件和装配方式,并且在构建过程中可以重用一些部件。
下面对一个典型的例子:计算机组装 进行解释说明
6、代码实现
例如,我们需要构建一台计算机,计算机包含CPU、内存、主板、硬盘等组成部分,每种组成部分又有多种不同的型号可供选择。我们可以使用建造者模式来构建这台计算机。
首先我们定义一个计算机类 Computer,它是产品类,包含 CPU、内存、主板、硬盘等组成部分。
1. public class Computer { 2. private String CPU; 3. private String Memory; 4. private String Mainboard; 5. private String HDD; 6. // getter and setter 7. }
然后我们定义一个抽象建造者类 ComputerBuilder,它规范了建造计算机的各个部分的构建:
1. public abstract class ComputerBuilder { 2. protected Computer computer; 3. public void createNewComputer(){ 4. computer = new Computer(); 5. } 6. public abstract void buildCPU(); 7. public abstract void buildMemory(); 8. public abstract void buildMainboard(); 9. public abstract void buildHDD(); 10. public Computer getComputer(){ 11. return computer; 12. } 13. }
然后我们可以创建不同的具体建造者类实现抽象建造者类中定义的抽象方法:
1. public class HighEndComputerBuilder extends ComputerBuilder { 2. public void buildCPU() { 3. computer.setCPU("i9-9900K"); 4. } 5. }
然后我们定义指挥者类ComputerEngineer,它负责控制建造过程:
1. public class ComputerEngineer { 2. private ComputerBuilder computerBuilder; 3. public void setComputerBuilder(ComputerBuilder computerBuilder) { 4. this.computerBuilder = computerBuilder; 5. } 6. public Computer getComputer() { 7. return computerBuilder.getComputer(); 8. } 9. public void constructComputer() { 10. computerBuilder.createNewComputer(); 11. computerBuilder.buildCPU(); 12. computerBuilder.buildMemory(); 13. computerBuilder.buildMainboard(); 14. computerBuilder.buildHDD(); 15. } 16. }
最后客户端调用指挥者类的constructComputer()方法就可以创建自己需要的计算机了,如
1. ComputerEngineer engineer = new ComputerEngineer(); 2. engineer.setComputerBuilder(new HighEndComputerBuilder()); 3. engineer.constructComputer(); 4. Computer computer = engineer.getComputer();
建造者模式将产品的构建过程和最终产品进行了解耦,使得构建过程可以独立变化,而不影响使用产品的客户端.