软件设计模式系列之五——建造者模式
1 模式的定义
建造者模式是一种对象创建型设计模式,它将一个复杂对象的构建过程与其表示分离。这意味着你可以使用相同的构建过程来创建不同类型的对象,而不必关心每个对象的内部细节。这种模式适用于构建具有复杂配置的对象,例如具有多个可选组件的汽车。
2 结构
建造者模式的结构包括以下几个关键部分:
Director(指导者):负责指导构建过程的顺序,它并不直接创建产品,而是通过建造者来构建产品。
Builder(建造者):定义了创建产品各个部分的接口,具体的建造者实现这些接口以构建具体产品。
ConcreteBuilder(具体建造者):实现了Builder接口,负责具体产品的构建过程。
Product(产品):表示最终构建出的复杂对象,它通常包含了多个部分。
3 举例说明
建造者模式可以通过组装电脑的过程来解释。在电脑组装中,你有多个可选组件(如CPU、内存、硬盘、显卡等),每个组件有不同的配置选项。建造者模式将这个过程分解为以下部分:
产品(Product):电脑是最终的产品,具有多个组件(CPU、内存等)。
抽象建造者(Builder):定义了创建电脑各个组件的接口,例如安装CPU、内存等。
具体建造者(Concrete Builder):每个具体建造者实现了抽象建造者接口,负责构建不同配置的电脑,例如高性能电脑、办公电脑等。
指导者(Director):负责指导建造电脑的顺序,如安装CPU、内存、硬盘等。
通过建造者模式,你可以使用相同的构建过程创建不同类型的电脑,保持了灵活性和可维护性,同时将构建过程与最终产品分离,使得电脑组装变得更加可控和可扩展。
4 实现步骤
建造者模式的实现步骤通常包括:
定义产品的抽象类或接口,以及产品的各个部分。
创建具体建造者类,实现Builder接口,负责构建产品的各个部分。
创建Director类,负责指导建造过程的顺序,它包含一个Builder成员变量用于构建产品。
在客户端代码中,创建Director对象并指定一个具体的建造者对象,然后通过Director来构建产品。
5 代码实现
以下是一个简单的Java代码示例,演示了如何使用建造者模式来组装电脑,包括CPU、硬盘和主板等组件.
// 产品类:电脑
class Computer {
private String cpu;
private String hardDisk;
private String motherboard;
public void setCPU(String cpu) {
this.cpu = cpu;
}
public void setHardDisk(String hardDisk) {
this.hardDisk = hardDisk;
}
public void setMotherboard(String motherboard) {
this.motherboard = motherboard;
}
@Override
public String toString() {
return "Computer [CPU=" + cpu + ", HardDisk=" + hardDisk + ", Motherboard=" + motherboard + "]";
}
}
// 抽象建造者接口
interface ComputerBuilder {
void buildCPU();
void buildHardDisk();
void buildMotherboard();
Computer getComputer();
}
// 具体建造者类
class HighEndComputerBuilder implements ComputerBuilder {
private Computer computer;
public HighEndComputerBuilder() {
computer = new Computer();
}
@Override
public void buildCPU() {
computer.setCPU("High-end CPU");
}
@Override
public void buildHardDisk() {
computer.setHardDisk("1TB SSD");
}
@Override
public void buildMotherboard() {
computer.setMotherboard("High-end Motherboard");
}
@Override
public Computer getComputer() {
return computer;
}
}
// 指导者类
class Director {
private ComputerBuilder computerBuilder;
public Director(ComputerBuilder builder) {
this.computerBuilder = builder;
}
public void constructComputer() {
computerBuilder.buildCPU();
computerBuilder.buildHardDisk();
computerBuilder.buildMotherboard();
}
}
// 客户端代码
public class Main {
public static void main(String[] args) {
ComputerBuilder builder = new HighEndComputerBuilder();
Director director = new Director(builder);
director.constructComputer();
Computer highEndComputer = builder.getComputer();
System.out.println("High-end Computer Specs:");
System.out.println(highEndComputer);
}
}
在这个示例中,我们定义了产品类Computer,抽象建造者接口ComputerBuilder,以及具体建造者类HighEndComputerBuilder。指导者类Director负责控制构建过程的顺序。客户端代码创建具体建造者对象并使用指导者来构建电脑。这样,我们就可以轻松地创建不同配置的电脑对象。
6 典型应用场景
建造者模式在创建复杂对象时,它可以提供一种更加灵活和可维护的方式。以下是建造者模式的一些典型应用场景:
创建复杂对象:建造者模式适用于构建复杂的对象,这些对象可能有多个组件或部分,而且这些组件之间存在复杂的依赖关系。例如,创建包含多个可选组件的电子产品、汽车、飞机等。
隐藏构造过程的细节:建造者模式允许将构造对象的复杂性封装在具体建造者中,客户端代码只需关心如何指导建造过程,而不必关心对象的具体构建细节。这有助于降低客户端代码的复杂性。
创建不同配置的对象:如果需要创建多个具有相似属性但不同配置的对象,建造者模式非常有用。你可以使用不同的具体建造者来创建不同配置的对象,而不必重复相似的构建代码。
提高代码可读性:通过使用建造者模式,可以清晰地看到对象的构建过程,使代码更易于理解和维护。每个具体建造者都负责一部分构建过程,使代码更加模块化和可读性更高。
避免对象不完整或不一致:建造者模式可以确保在构建对象的过程中不会产生不完整或不一致的对象。在构建过程中,要么对象完全构建成功,要么不构建。
总之,建造者模式在需要创建复杂对象、隐藏构建细节、提高可读性和灵活性等情况下非常有用。它允许你以分步骤的方式构建对象,并在创建过程中动态配置对象的属性,使得代码更易于管理和维护。
7 优缺点
优点:
将构建过程与产品表示分离,使得构建过程更灵活。
可以通过不同的具体建造者来创建不同类型的对象。
可以重复使用相同的构建过程来构建不同的对象。
缺点:
增加了代码的复杂性,因为需要定义抽象建造者和具体建造者类。
如果产品的部分组件较少,可能会显得过于繁琐。
8 类似模式
建造者模式与以下几种设计模式有一定的相似性:
抽象工厂模式(Abstract Factory Pattern):抽象工厂模式也用于创建复杂对象,但它关注的是创建一组相关或相互依赖的对象,而不是单个对象。建造者模式关注的是构建单个复杂对象,其构建过程逐步进行。
工厂模式(Factory Pattern):工厂模式用于创建对象,但不像建造者模式那样关心对象的构建过程的细节。工厂模式简单地返回一个已经构建好的对象,而建造者模式允许在构建过程中设置对象的属性和配置。
原型模式(Prototype Pattern):原型模式通过复制现有对象来创建新对象,而不需要详细的构建过程。与建造者模式不同,原型模式不涉及构建对象的复杂性,而是复制现有对象的状态。
9 小结
建造者模式是一种有助于创建复杂对象的设计模式,它通过将构建过程分步骤进行,允许你创建不同类型的对象,并保持构建过程的独立性。通过定义抽象建造者和具体建造者类,以及使用指导者来管理构建顺序,你可以更好地控制对象的构建过程。建造者模式在需要创建多个不同配置的对象或构建过程较为复杂的情况下特别有用。但要注意,它可能会增加代码的复杂性,因此应在合适的情况下使用。