• 建造者模式(Builder Pattern)


    1、类型

    创建型
    解释:设计模式的创建性类型是一种软件设计模式,它专注于对象的创建机制,帮助我们更加灵活地创建对象实例。创建性设计模式主要关注如何更好地创建对象,以及如何将对象与其创建方式分离,从而使系统更加灵活、可扩展和易于维护。

    常见的创建性设计模式包括:

    • 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪个类。这样在不改变该类的用户的情况下,可以修改实例化的具体类。

    • 抽象工厂模式(Abstract Factory Pattern):提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

    • 建造者模式(Builder Pattern):将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

    • 单例模式(Singleton Pattern):确保一个类只有一个实例,并提供一个全局访问点。

    • 原型模式(Prototype Pattern):用于创建重复的对象,同时又能保证性能。

    2、定义

    创建者模式又叫建造者模式,是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象

    何时使用:一些基本部件不会变,而其组合经常变化的时候。

    3、UML图

    在这里插入图片描述

    4、四个角色

    1. Product(产品角色): 一个具体的产品对象。

    2. Builder(抽象建造者): 创建一个Product对象的各个部件指定的接口/抽象类。

    3. ConcreteBuilder(具体建造者): 实现接口,构建和装配各个部件。

    4. Director(指挥者): 构建一个使用Builder接口的对象。它主要是用于创建一个 复杂的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。

    5、代码

    // 产品角色
    @Data
    @ToString
    public class Product {
        /**
         * 名称
         */
        private String name;
        /**
         * 价格
         */
        private Integer price;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    // 抽象建造者
    public abstract class Builder {
    
    
        public abstract void setProductName();
    
        public abstract void SetProductPrice();
    
        public abstract Product createProduct();
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    // 具体建造者1
    public class ProductOne extends Builder {
        public Product product=new Product();
    
        public void setProductName() {
            this.product.setName("产品1");
        }
    
        public void SetProductPrice() {
            this.product.setPrice(100);
        }
    
        public Product createProduct() {
            return this.product;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    // 具体建造者2
    public class ProductTwo extends Builder {
        public Product product = new Product();
    
        public void setProductName() {
            this.product.setName("产品2");
        }
    
        public void SetProductPrice() {
            this.product.setPrice(200);
        }
    
        public Product createProduct() {
            return this.product;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    //指挥者
    public class Director {
        Builder builder;
    
        public Director(Builder builder) {
            this.builder = builder;
        }
    
        public Product assemble() {
            this.builder.setProductName();
            this.builder.SetProductPrice();
            return this.builder.createProduct();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    // 客户端
    public class Client {
        public static void main(String[] args) {
    
            Director director = new Director(new ProductOne());
            Product product = director.assemble();
            System.out.println(product);
    
    
            Director director1 = new Director(new ProductTwo());
            Product product1 = director1.assemble();
            System.out.println(product1);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    6、应用场景

    • 创建复杂对象:当需要创建一个复杂的对象,该对象拥有多个组成部分(例如具有多个属性或配置选项)且这些组成部分之间存在特定的创建顺序或依赖关系时,建造者模式可以很好地解决这种情况。

    • 需要创建不同表示的对象:如果希望在创建过程中能够灵活地控制对象的创建过程,以便根据不同的需求创建不同表示的对象,建造者模式是一个很好的选择。

    • 创建过程需要隔离:在某些情况下,我们希望将对象的构建过程与其最终表示分离开来,以便能够更加灵活地控制对象的创建过程。建造者模式正是为此而设计的。

    • 需要避免构造器参数过多:当一个类的构造函数参数过多或者存在多个重载的构造函数时,可以考虑使用建造者模式,通过链式调用的方式,使得参数设置更加清晰、易读。

  • 相关阅读:
    看完这篇,还不懂JAVA内存模型(JMM)算我输
    如何办一份有价值的企业内刊/报纸?向《华为人》学习就够了
    一步教你怎么使用Vuex
    [buuctf][SUCTF2019]SignIn
    图解LeetCode——剑指 Offer II 025. 链表中的两数相加(难度:中等)
    Android数据结构和算法总结-字符串相关高频面试题算法
    react hook: useId
    【MySQL】表的增删改查(二)
    Java并发(十二)----线程应用之多线程解决烧水泡茶问题
    Docker容器-------compose容器集群的快速编排
  • 原文地址:https://blog.csdn.net/qq_42392981/article/details/134303197