设计模式-建造者模式

发布时间:2024年01月14日

一 建造者模式

? ? ? ?建造者模式(Builder Pattern)是一种创建型设计模式,它提供了一种将复杂对象的构建过程与它的表示分离的方式。在该模式中,一个复杂的对象被拆分成多个可配置的部分,每个部分可以通过一系列独立的步骤来构造,最后再组合成完整的对象。这种分离使得用户可以灵活地控制构建过程,并且可以使用相同的构造流程来创建不同形式的产品。

主要角色和职责:

1 Product (产品类)

  • 定义了要构建的复杂对象的接口或抽象类,包含了组成复杂对象的所有属性和方法。

2 ConcreteProduct (具体产品类)

  • 实现了 Product 接口的具体类,是最终生成的复杂对象实例。

3 Builder (抽象建造者)

  • 提供了一个创建产品的接口,声明了一系列用于逐步构建组件的方法(例如?buildPartA(),?buildPartB()),并包含一个返回最终产品的方法(如?getResult())。

4 ConcreteBuilder (具体建造者)

  • 实现 Builder 接口,定义并实现了如何具体构建每个组件的方法,负责具体构造和装配过程,记录建造过程中的中间状态。

5 Director (导演类/构造器)

  • 可选的角色,它不直接参与具体的构建细节,而是负责协调并指定建造者按照特定顺序来构造产品。客户端通常通过 Director 来指导建造过程,避免与具体的建造者耦合。

示例代码:

? 用创造者模式实现计算机高低端配置示例:

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");
    }
}

应用场景:

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

优点:

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

缺点:

  • 如果构造过程非常简单或者产品类没有太多变化,则可能增加不必要的复杂性。
  • 对于简单的系统可能会过度设计。

文章来源:https://blog.csdn.net/qyhua/article/details/135584431
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。