5、建造者模式(Builder Pattern)

建造者模式(Builder Pattern)使用多个简单的对象创建一个复杂的对象,用于将一个复杂的构建与其表示分离,使得同样的构建过程可以创建不同的表示,然后通过一个Builder类(该Builder类是独立于其他对象的)创建最终的对象。

建造者模式主要用于解决软件系统中复杂对象的创建问题,比如有些复杂对象的创建需要通过各部分的子对象用一定的算法构成,在需求变化时这些复杂对象将面临很大的改变,这十分不利于系统的稳定。但是,使用建造者模式能将它们各部分的算法包装起来,在需求变化后只需调整各个算法的组合方式和顺序,能极大提高系统的稳定性。建造者模式常被用于一些基本部件不会变而其组合经常变化的应用场景下。

注意,建造者模式与工厂模式的最大区别是,建造者模式更关注产品的组合方式和装配顺序,而工厂模式关注产品的生产本身。

建造者模式在设计时有以下几种角色:

  • Builder:创建一个复杂产品对象的抽象接口。
  • ConcreteBuilder:Builder接口的实现类,用于定义复杂产品各个部件的装配流程。
  • Director:构造一个使用Builder接口的对象。
  • Product:表示被构造的复杂对象。ConcreteBuilder定义了该复杂对象的装配流程,而Product定义了该复杂对象的结构和内部表示。

以生产一个电脑为例,电脑的生产包括CPU、Memory、Disk等生产过程,这些生产过程对顺序不敏感,这里的Product角色就是电脑。我们还需要定义生产电脑的Builder、ConcreteBuilder和Director。UML的设计如下图:

具体实现如下:

  1. 定义需要生产的产品Computer
    package cn.jaa.builder_pattern;
    
    import lombok.Data;
    
    @Data
    public class Computer {
        private String cpu;
        private String memory;
        private String disk;
    }
  2. 定义抽象接口ComputerBuilder来描述产品构造和装配的过程
    package cn.jaa.builder_pattern;
    
    public interface ComputerBuilder {
        void buildCPU();
        void buildMemory();
        void buildDisk();
        Computer buildComputer();
    }
  3. 定义ComputerBuilder接口实现类ComputerConcreteBuilder以实现构造和装配该产品的各个组件
    package cn.jaa.builder_pattern;
    
    import cn.jaa.factory_pattern.FactoryDemo;
    
    import java.util.logging.Logger;
    
    public class ComputerConcreteBuilder implements ComputerBuilder {
    
        private static final Logger log = Logger.getLogger(String.valueOf(ComputerConcreteBuilder.class));
    
        Computer computer;
    
        public ComputerConcreteBuilder() {
            computer = new Computer();
        }
    
        @Override
        public void buildCPU() {
            log.info("build cpu...");
            computer.setCpu("16core");
        }
    
        @Override
        public void buildMemory() {
            log.info("build memory...");
            computer.setMemory("64G");
        }
    
        @Override
        public void buildDisk() {
            log.info("build disk...");
            computer.setDisk("1TG");
        }
    
        @Override
        public Computer buildComputer() {
            return computer;
        }
    }
  4. 定义ComputerDirector使用Builder接口实现产品的装配
    package cn.jaa.builder_pattern;
    
    public class ComputerDirector {
    
        public Computer constructComputer(ComputerBuilder computerBuilder) {
            computerBuilder.buildCPU();
            computerBuilder.buildMemory();
            computerBuilder.buildDisk();
            return computerBuilder.buildComputer();
        }
    }
  5. 构建Computer测试
    package cn.jaa.builder_pattern;
    
    import java.util.logging.Logger;
    
    /**
     * @Author: Jaa
     * @Description:
     * @Date 2023/11/28 21:37
     */
    public class BuildComputerTest {
    
        private static final Logger log = Logger.getLogger(String.valueOf(BuildComputerTest.class));
    
        public static void main(String[] args) {
            ComputerDirector computerDirector = new ComputerDirector();
            ComputerBuilder computerBuilder = new ComputerConcreteBuilder();
            Computer computer = computerDirector.constructComputer(computerBuilder);
            log.info(computer.getCpu());
            log.info(computer.getMemory());
            log.info(computer.getDisk());
        }
    }

    运行结果:

相关推荐

  1. GO设计模式——5建造模式(创建型)

    2023-12-07 04:40:03       51 阅读
  2. 建造模式(Builder)

    2023-12-07 04:40:03       59 阅读
  3. 建造模式

    2023-12-07 04:40:03       39 阅读
  4. 建造模式

    2023-12-07 04:40:03       48 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-07 04:40:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-07 04:40:03       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-07 04:40:03       82 阅读
  4. Python语言-面向对象

    2023-12-07 04:40:03       91 阅读

热门阅读

  1. C++设计模式——建造者模式(Builder)

    2023-12-07 04:40:03       76 阅读
  2. ES6拓展API

    2023-12-07 04:40:03       55 阅读
  3. Socket.D 网络应用协议,首版发布!

    2023-12-07 04:40:03       59 阅读
  4. 字符指针变量

    2023-12-07 04:40:03       54 阅读
  5. 数据结构-基数排序

    2023-12-07 04:40:03       62 阅读
  6. 利用 Python 进行数据分析实验(二)

    2023-12-07 04:40:03       61 阅读
  7. linux系统调用介绍

    2023-12-07 04:40:03       65 阅读
  8. Vue的methods中定时器的变量报错问题

    2023-12-07 04:40:03       60 阅读
  9. C++ day50 买卖股票最佳时机

    2023-12-07 04:40:03       63 阅读
  10. linux优化-平均负载率

    2023-12-07 04:40:03       57 阅读
  11. 数据结构 / 队列 / 循环队列 / 结构体定义和创建

    2023-12-07 04:40:03       66 阅读
  12. vue的模板语法

    2023-12-07 04:40:03       66 阅读
  13. 使用右值常量进行测试的boost::foreach模块

    2023-12-07 04:40:03       62 阅读
  14. Vue经典面试题源码级分析【一】

    2023-12-07 04:40:03       60 阅读
  15. C#学习相关系列之数组---常用方法使用(二)

    2023-12-07 04:40:03       60 阅读