设计模式之建造者模式

1.建造者模式概念

  • 建造者模式(builder Pattern)
    • 使用多个简单的对象一步一步构建成一个复杂的对象,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
    • 允许用户只通过制定复杂对象的类型和内容就可以构建它们,不需要知道内部的具体构建细节
  • 核心组成
    • Builder:抽象建造者,定义多个通用方法和构建方法
    • ConcreteBuilder:具体建造者,可以有多个
    • Director:指挥者,控制整个组合过程,将需求交给建造者,由建造者去创建对象
    • Product:产品角色

2.代码编写

  • 代码示例,以组装电脑为例子

    java 复制代码
    /**
     * 具体产品
     */
    class Computer {
        private String cpu;
        private String memory;
    
        public String getCpu() {
            return cpu;
        }
    
        public void setCpu(String cpu) {
            this.cpu = cpu;
        }
    
        public String getMemory() {
            return memory;
        }
    
        public void setMemory(String memory) {
            this.memory = memory;
        }
    
        @Override
        public String toString() {
            return "Computer{" +
                    "cpu='" + cpu + '\'' +
                    ", memory='" + memory + '\'' +
                    '}';
        }
    }
    
    /**
     * 声明了建造者的公共方法
     */
    interface Builder {
        void buildCpu();
    
        void buildMemory();
    
        Computer createComputer();
    }
    
    /**
     * 具体的建造者,实现builder来创建不同的产品
     * 低配电脑
     */
    class LowComputerBuilder implements Builder {
    
        private Computer computer = new Computer();
    
        @Override
        public void buildCpu() {
            computer.setCpu("低配 CPU");
        }
    
        @Override
        public void buildMemory() {
            computer.setMemory("低配 内存");
        }
    
        @Override
        public Computer createComputer() {
            return computer;
        }
    }
    
    /**
     * 具体的建造者,实现builder来创建不同的产品
     * 高配电脑
     */
    class HighComputerBuilder implements Builder {
    
        private Computer computer = new Computer();
    
        @Override
        public void buildCpu() {
            computer.setCpu("高配 CPU");
        }
    
        @Override
        public void buildMemory() {
            computer.setMemory("高配 内存");
        }
    
        @Override
        public Computer createComputer() {
            return computer;
        }
    }
    
    /**
     * 将产品和创建过程进行解耦,使用相同的创建过程创建不同的产品,控制产品生产过程
     * Director是全程指导组装过程,具体的细节还是builder去操作
     */
    class Director {
        public Computer build(Builder builder) {
            builder.buildCpu();
            builder.buildMemory();
            return builder.createComputer();
        }
    }
    
    public class Main {
        public static void main(String[] args) throws CloneNotSupportedException {
            Director director = new Director();
            Computer lowComputer = director.build(new LowComputerBuilder());
            Computer highComputer = director.build(new HighComputerBuilder());
            System.out.println(lowComputer);
            System.out.println(highComputer);
        }
    }
  • 优点

    • 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦
    • 每一个具体建造者都相对独立,而与其他的具体建造者无关,更加精细地控制产品的创建过程
    • 增加新的具体建造者无需修改原有类库的代码,符合开闭原则
    • 建造者模式结合链式编程来使用,代码上更加美观
  • 缺点

    • 建造者模式所创建的产品一般具有较多的共同点,如果产品差异大则不建议使用
  • 建造者模式与抽象工厂模式的比较

    • 建造者模式返回一个组装好的完整产品
    • 抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族
相关推荐
reddingtons5 小时前
【游戏宣发】PS “生成式扩展”流,30秒无损适配全渠道KV
游戏·设计模式·新媒体运营·prompt·aigc·教育电商·游戏美术
李慕婉学姐6 小时前
【开题答辩过程】以《基于JAVA的校园即时配送系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·开发语言·数据库
奋进的芋圆7 小时前
Java 延时任务实现方案详解(适用于 Spring Boot 3)
java·spring boot·redis·rabbitmq
sxlishaobin8 小时前
设计模式之桥接模式
java·设计模式·桥接模式
model20058 小时前
alibaba linux3 系统盘网站迁移数据盘
java·服务器·前端
荒诞硬汉8 小时前
JavaBean相关补充
java·开发语言
提笔忘字的帝国8 小时前
【教程】macOS 如何完全卸载 Java 开发环境
java·开发语言·macos
2501_941882489 小时前
从灰度发布到流量切分的互联网工程语法控制与多语言实现实践思路随笔分享
java·开发语言
華勳全栈9 小时前
两天开发完成智能体平台
java·spring·go
alonewolf_999 小时前
Spring MVC重点功能底层源码深度解析
java·spring·mvc