软件设计模式系列之五——建造者模式

软件设计,模式,系列,建造 · 浏览次数 : 185

小编点评

**建造者模式**是一种对象创建型设计模式,它将一个复杂对象的构建过程与其表示分离。这意味着你可以使用相同的构建过程来创建不同类型的对象,而不必关心每个对象的内部细节。 **结构建造者模式的结构包括:** * **Director(指导者):**负责指导构建过程的顺序,它并不直接创建产品,而是通过建造者来构建产品。 * **Builder(建造者):**定义了创建产品各个部分的接口,具体的建造者实现这些接口以构建具体产品。 * **ConcreteBuilder(具体建造者):**实现了Builder接口,负责具体产品的构建过程。 **示例:** ```java // 产品类:电脑 class Computer { private String cpu; private String hardDisk; private String motherboard; @Override public String toString() { return \"Computer [CPU=\" + cpu + \", HardDisk=\" + hardDisk + \", Motherboard=\" + motherboard + \"]\"; } } // 抽象建造者接口 interface ComputerBuilder { void buildCPU(); void buildHardDisk(); void buildMotherboard(); Computer getComputer(); } // 具体建造者类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; } } ```

正文

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 小结

建造者模式是一种有助于创建复杂对象的设计模式,它通过将构建过程分步骤进行,允许你创建不同类型的对象,并保持构建过程的独立性。通过定义抽象建造者和具体建造者类,以及使用指导者来管理构建顺序,你可以更好地控制对象的构建过程。建造者模式在需要创建多个不同配置的对象或构建过程较为复杂的情况下特别有用。但要注意,它可能会增加代码的复杂性,因此应在合适的情况下使用。

与软件设计模式系列之五——建造者模式相似的内容:

软件设计模式系列之五——建造者模式

建造者模式是一种对象创建型设计模式,它将一个复杂对象的构建过程与其表示分离。这意味着你可以使用相同的构建过程来创建不同类型的对象,而不必关心每个对象的内部细节。

从零做软件开发项目系列之五——系统开发过程

在软件项目的设计开发过程中,除了前期的用户需求调研确认,系统设计、数据库设计等工作之外,还有一些重要的工作需要考虑,比如软件开发模式,如何制定开发计划,如何协调开发人员开展开发工作等。

软件设计模式系列之十一——装饰模式

装饰模式属于结构型设计模式,它通过将对象包装在装饰器类中来动态地添加额外的行为,而不需要修改原始对象的代码。这个模式以透明的方式向对象添加功能,从而使您可以根据需要组合各种功能。

软件设计模式系列之十二——外观模式

外观模式是一种结构型设计模式,它提供了一个简化的接口,用于访问系统中的一组相关接口,以隐藏系统的复杂性。外观模式的主要目标是简化客户端与子系统之间的交互,同时降低了系统的耦合度。它允许客户端通过一个统一的入口点来与系统进行通信,而不需要了解系统内部的具体细节和复杂性

软件设计模式系列之十三——享元模式

享元模式(Flyweight Pattern)是一种结构型设计模式,它旨在减少内存占用或计算开销,通过共享大量细粒度对象来提高系统的性能。这种模式适用于存在大量相似对象实例,但它们的状态可以外部化(extrinsic),并且可以在多个对象之间共享的情况。

软件设计模式系列之十四——代理模式

代理模式是一种结构型设计模式,它允许一个对象(代理)充当另一个对象的接口,以控制对该对象的访问。代理模式通常用于控制对真实对象的访问,以实现一些额外的功能,例如延迟加载、权限控制、日志记录等。这种模式属于结构型设计模式,因为它关注对象之间的组合,以形成更大的结构。

软件设计模式系列之二十五——访问者模式

访问者模式(Visitor Pattern)是一种强大的行为型设计模式,它允许你在不改变被访问对象的类的前提下,定义新的操作和行为。本文将详细介绍访问者模式,包括其定义、举例说明、结构、实现步骤、Java代码实现、典型应用场景、优缺点、类似模式以及最后的小结。

软件设计模式系列之二十四——模板方法模式

在软件设计领域,设计模式是一组被反复使用、多次实践验证的经典问题解决方案。其中,模板方法模式是一种行为型设计模式,用于定义一个算法的骨架,将算法中的某些步骤延迟到子类中实现,从而使子类可以重新定义算法的某些特定步骤,同时保持算法的整体结构不变。本文将深入探讨模板方法模式,包括其定义、举例、结构、实现...

软件设计模式系列之二十三——策略模式

策略模式(Strategy Pattern)是一种行为型设计模式,它允许在运行时动态选择算法的行为。这意味着你可以定义一系列算法,将它们封装成独立的策略对象,然后根据需要在不修改客户端代码的情况下切换这些算法。策略模式有助于解决问题领域中不同行为的变化和扩展,同时保持代码的灵活性和可维护性。

软件设计模式系列之二十二——状态模式

状态模式是一种行为型设计模式,它允许对象在内部状态发生改变时改变其行为,使得对象的行为看起来像是改变了其类。状态模式将对象的状态抽象成一个独立的类,让对象在不同状态下具有不同的行为,而且可以在运行时切换状态。这种方式使得状态的管理更加清晰,避免了大量的条件判断语句,提高了代码的可维护性和可扩展性。