设计模式-建造者模式

一 建造者模式

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

应用场景:

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

优点:

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

缺点:

  • 如果构造过程非常简单或者产品类没有太多变化,则可能增加不必要的复杂性。
  • 对于简单的系统可能会过度设计。
相关推荐
苏渡苇2 小时前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
短剑重铸之日3 小时前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
feasibility.4 小时前
AI 编程助手进阶指南:从 Claude Code 到 OpenCode 的工程化经验总结
人工智能·经验分享·设计模式·自动化·agi·skills·opencode
BD_Marathon4 小时前
七大设计原则介绍
设计模式
YigAin6 小时前
Unity23种设计模式之 享元模式
设计模式·享元模式
范纹杉想快点毕业20 小时前
实战级ZYNQ中断状态机FIFO设计
java·开发语言·驱动开发·设计模式·架构·mfc
茂桑1 天前
DDD领域驱动设计-基础设施层
设计模式·架构
小温冲冲1 天前
通俗且全面精讲工厂设计模式
设计模式
进击的小头1 天前
设计模式与C语言高级特性的结合
c语言·设计模式
小温冲冲1 天前
通俗且全面精讲单例设计模式
开发语言·javascript·设计模式