一 建造者模式
建造者模式(Builder Pattern)是一种创建型设计模式,它提供了一种将复杂对象的构建过程与它的表示分离的方式。在该模式中,一个复杂的对象被拆分成多个可配置的部分,每个部分可以通过一系列独立的步骤来构造,最后再组合成完整的对象。这种分离使得用户可以灵活地控制构建过程,并且可以使用相同的构造流程来创建不同形式的产品。
主要角色和职责:
1 Product (产品类)
- 定义了要构建的复杂对象的接口或抽象类,包含了组成复杂对象的所有属性和方法。
2 ConcreteProduct (具体产品类)
- 实现了 Product 接口的具体类,是最终生成的复杂对象实例。
3 Builder (抽象建造者)
- 提供了一个创建产品的接口,声明了一系列用于逐步构建组件的方法(例如
buildPartA()
,buildPartB()
),并包含一个返回最终产品的方法(如getResult()
)。
4 ConcreteBuilder (具体建造者)
- 实现 Builder 接口,定义并实现了如何具体构建每个组件的方法,负责具体构造和装配过程,记录建造过程中的中间状态。
5 Director (导演类/构造器)
- 可选的角色,它不直接参与具体的构建细节,而是负责协调并指定建造者按照特定顺序来构造产品。客户端通常通过 Director 来指导建造过程,避免与具体的建造者耦合。
示例代码:
用创造者模式实现计算机高低端配置示例:
java
package com.jxwifi.kyc.api;
/**
* @author hua
* 产品角色:计算机
*/
public class Computer {
private String cpu;
private int ram;
private int hardDisk;
// 构造器私有化,不允许直接实例化
private Computer(Builder builder) {
this.cpu = builder.cpu;
this.ram = builder.ram;
this.hardDisk = builder.hardDisk;
}
// 获取计算机配置-CPU信息
public String getCpu() {
return cpu;
}
// 获取计算机配置-内存信息
public int getRam() {
return ram;
}
// 获取计算机配置-磁盘信息
public int getHardDisk() {
return hardDisk;
}
/**
* 抽象建造者角色
*/
public static abstract class Builder {
protected String cpu; // CPU型号
protected int ram; // 内存大小
protected int hardDisk; // 硬盘容量
// 设置基本配置的方法
public Builder setCpu(String cpu) {
this.cpu = cpu;
return this;
}
public Builder setRam(int ram) {
this.ram = ram;
return this;
}
public Builder setHardDisk(int hardDisk) {
this.hardDisk = hardDisk;
return this;
}
// 抽象方法,用于创建最终的产品对象
public abstract Computer build();
}
/**
* 具体建造者角色:高端电脑建造者
*/
public static class HighEndComputerBuilder extends Builder {
@Override
public Computer build() {
return new Computer(this);
}
}
/**
* 具体建造者角色:基础办公电脑建造者
*/
public static class BasicOfficeComputerBuilder extends Builder {
@Override
public Computer build() {
// 可以在这里添加额外的基础配置逻辑
return new Computer(this);
}
}
// 使用示例
public static void main(String[] args) {
// 创建一个高端电脑建造者
Builder highBuilder = new HighEndComputerBuilder()
.setCpu("Intel i9")
.setRam(32)
.setHardDisk(1024);
// 使用建造者创建一台高端电脑
Computer highEndComputer = highBuilder.build();
// 输出高端电脑配置
System.out.println("High Computer Configuration:");
System.out.println("CPU: " + highEndComputer.getCpu());
System.out.println("RAM: " + highEndComputer.getRam() + " GB");
System.out.println("Hard Disk: " + highEndComputer.getHardDisk() + " GB");
// 创建一个基础办公电脑建造者并构造电脑
Builder basicBuilder = new BasicOfficeComputerBuilder()
.setCpu("Intel i3")
.setRam(8)
.setHardDisk(500);
Computer basicComputer = basicBuilder.build();
// 输出基础办公电脑配置
System.out.println("Basic Office Computer Configuration:");
System.out.println("CPU: " + basicComputer.getCpu());
System.out.println("RAM: " + basicComputer.getRam() + " GB");
System.out.println("Hard Disk: " + basicComputer.getHardDisk() + " GB");
}
}
应用场景:
- 当对象的内部结构较为复杂,包含多个可变部分时,且这些部分可以以不同的方式组合。
- 构造过程需要分步骤进行,且允许使用者定制化各个步骤。
- 需要隐藏产品的具体实现细节,将构造代码与使用代码解耦。
优点:
- 将构建代码与表示代码分离,使它们可以独立变化。
- 支持细粒度的、灵活的构造过程。
- 有利于应对多态性需求,不同的建造者可以创建出相同接口但内容不同的对象。
缺点:
- 如果构造过程非常简单或者产品类没有太多变化,则可能增加不必要的复杂性。
- 对于简单的系统可能会过度设计。