问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

建造者模式(Builder Pattern):优雅地构建复杂对象

创作时间:
作者:
@小白创作中心

建造者模式(Builder Pattern):优雅地构建复杂对象

引用
CSDN
1.
https://m.blog.csdn.net/weixin_45970964/article/details/144257779

在软件开发中,我们常常遇到需要创建复杂对象的场景。当一个对象有多个属性,且这些属性的组合可能非常多样时,传统的构造函数或工厂模式可能会显得笨拙。这就是建造者模式(Builder Pattern)发挥作用的地方。

建造者模式的核心概念

建造者模式是一种创建型设计模式,它能够将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

模式角色解析

建造者模式通常包含以下关键角色:

  1. 产品类(Product):最终要创建的复杂对象

  2. 抽象建造者(Builder):定义创建产品各个部件的抽象接口

  3. 具体建造者(ConcreteBuilder):实现抽象建造者,负责具体的构建过程

  4. 指挥者(Director):控制构建过程,但不直接涉及产品的细节

代码示例:以计算机配置为例

建造者模式计算机配置示例


// 产品角色(Product):计算机类
public class Computer {
    // 产品的复杂属性
    private String cpu;       // CPU
    private String memory;    // 内存
    private String mainBoard; // 主板
    private String hardDisk;  // 硬盘
    private String displayCard; // 显卡
    // 私有构造方法,只能通过建造者创建
    private Computer(ComputerBuilder builder) {
        this.cpu = builder.cpu;
        this.memory = builder.memory;
        this.mainBoard = builder.mainBoard;
        this.hardDisk = builder.hardDisk;
        this.displayCard = builder.displayCard;
    }
    @Override
    public String toString() {
        return "Computer{" +
                "CPU='" + cpu + '\'' +
                ", 内存='" + memory + '\'' +
                ", 主板='" + mainBoard + '\'' +
                ", 硬盘='" + hardDisk + '\'' +
                ", 显卡='" + displayCard + '\'' +
                '}';
    }
    // 抽象建造者(Builder)接口:定义构建电脑各个部件的抽象接口
    public interface ComputerBuilder {
        // 定义构建各个部件的抽象方法
        ComputerBuilder cpu(String cpu);
        ComputerBuilder memory(String memory);
        ComputerBuilder mainBoard(String mainBoard);
        ComputerBuilder hardDisk(String hardDisk);
        ComputerBuilder displayCard(String displayCard);
        
        // 最终构建方法
        Computer build();
    }
    // 具体建造者(ConcreteBuilder):游戏电脑建造者
    public static class GamingComputerBuilder implements ComputerBuilder {
        // 具体建造者内部持有一个产品实例
        private String cpu;
        private String memory;
        private String mainBoard;
        private String hardDisk;
        private String displayCard;
        @Override
        public GamingComputerBuilder cpu(String cpu) {
            this.cpu = cpu;
            return this;
        }
        @Override
        public GamingComputerBuilder memory(String memory) {
            this.memory = memory;
            return this;
        }
        @Override
        public GamingComputerBuilder mainBoard(String mainBoard) {
            this.mainBoard = mainBoard;
            return this;
        }
        @Override
        public GamingComputerBuilder hardDisk(String hardDisk) {
            this.hardDisk = hardDisk;
            return this;
        }
        @Override
        public GamingComputerBuilder displayCard(String displayCard) {
            this.displayCard = displayCard;
            return this;
        }
        @Override
        public Computer build() {
            return new Computer(this);
        }
    }
    // 指挥者(Director):电脑配置指导类
    public static class ComputerDirector {
        // 指挥者使用建造者构建复杂对象
        public static Computer createHighEndGamingComputer(ComputerBuilder builder) {
            return builder
                .cpu("Intel i9-13900K")
                .memory("64GB DDR5")
                .mainBoard("ASUS ROG Maximus")
                .hardDisk("2TB PCIe 4.0 SSD")
                .displayCard("NVIDIA RTX 4090")
                .build();
        }
        public static Computer createOfficeComputer(ComputerBuilder builder) {
            return builder
                .cpu("Intel i5-13600K")
                .memory("16GB DDR4")
                .mainBoard("ASUS Pro WS")
                .hardDisk("1TB SSD")
                .displayCard("Integrated Graphics")
                .build();
        }
    }
    // 客户端使用示例
    public static void main(String[] args) {
        // 使用具体建造者创建游戏电脑
        Computer gamingPC = new Computer.ComputerDirector()
            .createHighEndGamingComputer(new GamingComputerBuilder());
        // 使用具体建造者创建办公电脑
        Computer officePC = new Computer.ComputerDirector()
            .createOfficeComputer(new GamingComputerBuilder());
        System.out.println("游戏电脑配置:" + gamingPC);
        System.out.println("办公电脑配置:" + officePC);
    }
}
  

可以使用内部类的方式:


// 产品类:计算机
class Computer {
    private String cpu;
    private String memory;
    private String hardDisk;
    private String displayCard;
    public Computer(ComputerBuilder builder) {
        this.cpu = builder.cpu;
        this.memory = builder.memory;
        this.hardDisk = builder.hardDisk;
        this.displayCard = builder.displayCard;
    }
    @Override
    public String toString() {
        return "Computer{" +
                "CPU='" + cpu + '\'' +
                ", 内存='" + memory + '\'' +
                ", 硬盘='" + hardDisk + '\'' +
                ", 显卡='" + displayCard + '\'' +
                '}';
    }
    // 建造者内部类
    public static class ComputerBuilder {
        private String cpu;
        private String memory;
        private String hardDisk;
        private String displayCard;
        public ComputerBuilder cpu(String cpu) {
            this.cpu = cpu;
            return this;
        }
        public ComputerBuilder memory(String memory) {
            this.memory = memory;
            return this;
        }
        public ComputerBuilder hardDisk(String hardDisk) {
            this.hardDisk = hardDisk;
            return this;
        }
        public ComputerBuilder displayCard(String displayCard) {
            this.displayCard = displayCard;
            return this;
        }
        public Computer build() {
            return new Computer(this);
        }
    }
}
// 使用示例
public class BuilderDemo {
    public static void main(String[] args) {
        Computer gamingComputer = new Computer.ComputerBuilder()
            .cpu("Intel i9")
            .memory("32GB")
            .hardDisk("1TB SSD")
            .displayCard("NVIDIA RTX 3080")
            .build();
        System.out.println(gamingComputer);
    }
}
  

建造者模式 vs 工厂模式

主要区别

  1. 目的不同
  • 工厂模式主要关注对象的创建

  • 建造者模式关注复杂对象的分步骤构建

  1. 构建灵活性
  • 工厂模式通常一次性创建完整对象

  • 建造者模式允许逐步配置对象,更加灵活

  1. 使用场景
  • 工厂模式适合创建简单对象

  • 建造者模式适合创建有多个部件,且配置复杂的对象

典型应用场景

  1. 构建复杂的配置对象

  2. 需要创建不可变对象

  3. 对象有大量可选参数

  4. 构建过程相对固定,但细节可变

优缺点分析

优点

  • 将复杂对象的构建和表示解耦

  • 提供更精细的控制构建过程

  • 链式调用使代码更加清晰

缺点

  • 会增加代码的复杂度

  • 对于简单对象可能会显得过度设计

结语

建造者模式是构建复杂对象的利器,它通过将对象构建的复杂逻辑封装起来,提供了一种优雅且灵活的对象创建方式。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号