设计模式-建造者模式

一 建造者模式

建造者模式(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");
    }
}

应用场景:

  • 当对象的内部结构较为复杂,包含多个可变部分时,且这些部分可以以不同的方式组合。
  • 构造过程需要分步骤进行,且允许使用者定制化各个步骤。
  • 需要隐藏产品的具体实现细节,将构造代码与使用代码解耦。

优点:

  • 将构建代码与表示代码分离,使它们可以独立变化。
  • 支持细粒度的、灵活的构造过程。
  • 有利于应对多态性需求,不同的建造者可以创建出相同接口但内容不同的对象。

缺点:

  • 如果构造过程非常简单或者产品类没有太多变化,则可能增加不必要的复杂性。
  • 对于简单的系统可能会过度设计。
相关推荐
渔舟小调1 小时前
P11 | 收藏与行程:用户行为类接口的设计模式
数据库·设计模式·oracle
小程故事多_803 小时前
从基础Agent到复杂工作流,LangGraph如何用状态机重构智能体开发
人工智能·设计模式·重构·aigc·ai编程
hypoy3 小时前
Claude Code 的 1M Context 怎么用:一篇官方文章的读后整理
设计模式·claude
IT 行者6 小时前
软件设计模式会不会是制约大模型编程的障碍?
设计模式·ai编程
t***5446 小时前
还有哪些设计模式适合现代C++
开发语言·c++·设计模式
t***5446 小时前
如何在现代C++项目中有效应用这些设计模式
开发语言·c++·设计模式
贵慜_Derek7 小时前
我们能从 DeerFlow 学到哪些优秀的技术架构设计
人工智能·设计模式·架构
ALex_zry7 小时前
Converter双向转换的边界条件处理
运维·服务器·建造者模式
Q741_1477 小时前
设计模式之装饰器模式 理论总结 C++代码实战
c++·设计模式·装饰器模式
无籽西瓜a8 小时前
【西瓜带你学设计模式 | 第十八期 - 命令模式】命令模式 —— 请求封装与撤销实现、优缺点与适用场景
java·后端·设计模式·软件工程·命令模式