设计模式-创建型模式:建造者

简介: 设计模式-创建型模式:建造者

1、简介

建造者模式(Builder pattern)是一种对象创建型模式,它可以将复杂对象的创建过程抽象出来,使得创建过程独立于对象的组成部分,从而可以得到相同类型的不同对象

建造者模式通过分离了对象的构建和表示,使得同样的构建过程可以创建不同的表示,这样就可以得到多种不同的组合对象

2、组成

建造者模式主要由四类角色组成:

①产品(Product)角色:它是被构造的复杂对象,包含多个组成部件。

②抽象建造者(Builder)角色:它是一个抽象类或者接口,规范了建造复杂对象的各个部分的构建一般至少要有两个方法,一个是建造部件part1,一个是建造部件part2。

③具体建造者(Concrete Builder)角色:实现了抽象建造者的接口,构建和装配各个部件。

④指挥者(Director)角色:它负责安排复杂对象的建造次序,指导构建过程。它不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建

3、Concrete Builder and Director

需要注意的是,具体建造者和指挥者可以不一定要都有,它们是可选的

建造者模式的具体建造者和指挥者不一定要都有,原因如下:

  1. 指挥者主要是用于规定构建对象的细节,如果对象构建过程简单,不需要细节控制,那么就没有必要提供指挥者
  2. 具体建造者主要是实现构建对象的具体实现,如果具体实现已经确定,并且不需要其他变化,那么也没有必要提供具体建造者。

简单来说,在没有指挥者和具体建造者时,构建对象的过程是比较简单,而且不需要细节控制,所以不需要提供指挥者和具体建造者这两个角色。

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();

建造者模式将产品的构建过程和最终产品进行了解耦,使得构建过程可以独立变化,而不影响使用产品的客户端.

相关文章
|
3月前
|
设计模式 存储 负载均衡
【五】设计模式~~~创建型模式~~~单例模式(Java)
文章详细介绍了单例模式(Singleton Pattern),这是一种确保一个类只有一个实例,并提供全局访问点的设计模式。文中通过Windows任务管理器的例子阐述了单例模式的动机,解释了如何通过私有构造函数、静态私有成员变量和公有静态方法实现单例模式。接着,通过负载均衡器的案例展示了单例模式的应用,并讨论了单例模式的优点、缺点以及适用场景。最后,文章还探讨了饿汉式和懒汉式单例的实现方式及其比较。
【五】设计模式~~~创建型模式~~~单例模式(Java)
|
3月前
|
设计模式 XML 存储
【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)
文章详细介绍了抽象工厂模式,这是一种创建型设计模式,用于提供一个接口以创建一系列相关或相互依赖的对象,而不指定它们具体的类。通过代码示例和结构图,文章展示了抽象工厂模式的动机、定义、结构、优点、缺点以及适用场景,并探讨了如何通过配置文件和反射机制实现工厂的动态创建。
【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)
|
3月前
|
设计模式 XML 存储
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
文章详细介绍了工厂方法模式(Factory Method Pattern),这是一种创建型设计模式,用于将对象的创建过程委托给多个工厂子类中的某一个,以实现对象创建的封装和扩展性。文章通过日志记录器的实例,展示了工厂方法模式的结构、角色、时序图、代码实现、优点、缺点以及适用环境,并探讨了如何通过配置文件和Java反射机制实现工厂的动态创建。
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
|
3月前
|
设计模式 XML Java
【一】设计模式~~~创建型模式~~~简单工厂模式(Java)
文章详细介绍了简单工厂模式(Simple Factory Pattern),这是一种创建型设计模式,用于根据输入参数的不同返回不同类的实例,而客户端不需要知道具体类名。文章通过图表类的实例,展示了简单工厂模式的结构、时序图、代码实现、优缺点以及适用环境,并提供了Java代码示例和扩展应用,如通过配置文件读取参数来实现对象的创建。
【一】设计模式~~~创建型模式~~~简单工厂模式(Java)
|
3月前
|
设计模式 存储 XML
[设计模式]创建型模式-抽象工厂模式
[设计模式]创建型模式-抽象工厂模式
|
3月前
|
设计模式 测试技术 Go
[设计模式]创建型模式-简单工厂模式
[设计模式]创建型模式-简单工厂模式
|
3月前
|
设计模式 XML 存储
【四】设计模式~~~创建型模式~~~建造者模式(Java)
文章详细介绍了建造者模式(Builder Pattern),这是一种创建型设计模式,用于将复杂对象的构建与其表示分离,允许分步骤创建一个复杂的对象而无需指定其内部的具体构造细节。通过定义抽象建造者、具体建造者、指挥者和产品角色,建造者模式允许通过相同的构建过程创建不同的产品表示,提高了系统的灵活性和扩展性。
|
3月前
|
设计模式 安全 测试技术
[设计模式]创建型模式-单例模式
[设计模式]创建型模式-单例模式
|
5月前
|
设计模式 Java 数据库连接
【Java设计模式 - 创建型模式2】工厂模式
【Java设计模式 - 创建型模式2】工厂模式
31 0
|
5月前
|
设计模式 缓存 安全
【Java设计模式 - 创建型模式1】单例模式
【Java设计模式 - 创建型模式1】单例模式
24 0