• 创建型设计模式之建造者模式


    建造者模式

    概述

    建造者模式(Builder Pattern)属于创建型模式

    它是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

    简而言之:建造者模式就是使用多个简单的对象一步一步构建成一个复杂的对象。

    建造者模式适用于创建对象需要很多步骤,但是步骤的顺序不一定固定。如果一个对象有非常复杂的内部结构(很多属性),可以将复杂对象的创建和使用进行分离。

    JDK的StringBuilder类中append()方法,提供了开放构造步骤,最后调用toString0方法就可以获得一个构造好的完整字符串。其就是一个建造者模式的体现。

    角色

    建造者模式提供四个主要角色:

    1.产品(Product)

    要创建的产品类对象。

    2.建造者抽象(Builder)

    建造者的抽象类,规范产品对象的各个组成部分的建造,一般由子类实现具体的建造过程。

    3.建造者(ConcreteBuilder)

    具体的Builder类,根据不同的业务逻辑,具体化对象的各个组成部分的创建。

    4.调用者(Director)

    调用具体的建造者,来创建对象的各个部分,在指导者中不涉及具体产品的信息,只负责保正对象各部分完整创建或按某种顺序创建。

    优缺点

    优点:

    1.封装性好,创建和使用分离。
    
    2.扩展性好,建造类之间独立、一定程度上解耦。
    
    • 1
    • 2
    • 3

    缺点:

    1.产生多余的Builder对象。
    
    2.产品内部发生变化,建造者都要修改,成本较大。
    
    • 1
    • 2
    • 3

    应用场景

    1.需要生成的对象具有复杂的内部结构。
    
    2.需要生成的对象内部属性本身相互依赖。
    
    3.相同的方法,不同的执行顺序,产生不同的结果。
    
    4.当初始化一个对象特别复杂,参数多,而且很多参数都具有默认值时。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    基本使用

    生产一辆Car的过程,需要一系列的步骤,假设这些步骤可以随意调整组合。

    创建产品类

    public class Car {
        /**
         * 名称
         */
        private String name;
        /**
         * 颜色
         */
        private String color;
        /**
         * 价格
         */
        private String price;
        /**
         * 类型
         */
        private String type;
        /**
         * 发动机
         */
        private String engine;
        /**
         * 轮子
         */
        private String wheel;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    创建建造者类

    创建建造者类,将复杂的构造过程封装起来,构造步骤由使用者决定

    public class CarBuilder {
        private Car car = new Car();
    
        public CarBuilder addName(String name) {
            car.setName(name);
            return this;
        }
        public CarBuilder addColor(String color) {
            car.setColor(color);
            return this;
        }
        public CarBuilder addPrice(String price) {
            car.setPrice(price);
            return this;
        }
        public CarBuilder addType(String type) {
            car.setType(type);
            return this;
        }
        public CarBuilder addEngine(String engine) {
            car.setEngine(engine);
            return this;
        }
        public CarBuilder addWheel(String wheel) {
            car.setWheel(wheel);
            return this;
        }
        public Car build() {
            return car;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    使用

        public static void main(String[] args) {
            CarBuilder carBuilder = new CarBuilder();
            Car car = carBuilder.addName("奔驰")
                    .addColor("红色")
                    .addPrice("100万")
                    .addType("轿车")
                    .addEngine("1.8T")
                    .addWheel("18寸")
                    .build();
            System.out.println(car);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    链式写法

    建造者模式通常是采用链式编程的方式构造对象。

    具体做法:

    将产品类添加到建造者类中作为内部类,然后将构造步骤添加进去,完成每个步骤,都返回this关键字。

    创建产品类与建造者类

    public class CarBuilder {
        @Data
        public class Car {
            /**
             * 品牌
             */
            private String name;
            /**
             * 颜色
             */
            private String color;
            /**
             * 价格
             */
            private String price;
            /**
             * 类型
             */
            private String type;
            /**
             * 发动机
             */
            private String engine;
            /**
             * 轮子
             */
            private String wheel;
        }
    
        private Car car = new Car();
    
        public CarBuilder addName(String name) {
            car.setName(name);
            return this;
        }
    
        public CarBuilder addColor(String color) {
            car.setColor(color);
            return this;
        }
    
        public CarBuilder addPrice(String price) {
            car.setPrice(price);
            return this;
        }
    
        public CarBuilder addType(String type) {
            car.setType(type);
            return this;
        }
    
        public CarBuilder addEngine(String engine) {
            car.setEngine(engine);
            return this;
        }
    
        public CarBuilder addWheel(String wheel) {
            car.setWheel(wheel);
            return this;
        }
    
        public Car build() {
            return car;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    使用

        public static void main(String[] args) {
            CarBuilder carBuilder = new CarBuilder();
            carBuilder.addName("奔驰").addColor("红色").addPrice("100万").addType("跑车").addEngine("发动机").addWheel("轮子");
            CarBuilder.Car car = carBuilder.build();
            System.out.println(car);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    稳如泰山:云计算网络连接稳定性保障之道
    数据之道读书笔记-01数据驱动的企业数字化转型
    线程协作(生产者消费者模式)
    内网穿透实战应用-如何通过内网穿透实现远程发送个人本地搭建的hMailServer的邮件服务
    python opencv比较图片相似度
    IMU+摄像头实现无标记运动捕捉
    大数据培训MapReduce常见错误及解决方案
    领先实践|全球最大红酒App如何用设计冲刺创新vivino模式
    题库API搭建接口
    10/15/2022
  • 原文地址:https://blog.csdn.net/qq_38628046/article/details/126087259