builder模式

使用背景 & 使用场景

  1. 重叠构造器模式(Telescoping Constructor Pattern):

特点: 通过在构造器中传递不同数量的参数,从而实现构建不同属性组合的对象。

优点: 简单直观,适用于属性较少的情况。

缺点: 随着属性增加,构造器的参数组合呈指数级增长,难以维护和理解。

public class Product {
    private String property1;
    private int property2;
    private boolean property3;
    public Product(String property1) {
        this.property1 = property1;
    }
    public Product(String property1, int property2) {
        this(property1);
        this.property2 = property2;
    }
    public Product(String property1, int property2, boolean property3) {
        this(property1, property2);
        this.property3 = property3;
    }
}

  1. JavaBeans 模式:

特点: 使用默认构造器创建对象,然后通过 setter 方法逐个设置属性的值。

优点: 灵活性较强,属性可以逐个设置。

缺点: 可能导致对象在构建过程中处于不完整状态,可变性带来的线程安全性问题,无法保证对象的不变性。

  • eg:property1 比如多个线程同时 通过set方法修改这个值,可能会存在线程安全问题
public class Product {
    private String property1;
    private int property2;
    private boolean property3;

    public Product() {
    }

    public void setProperty1(String property1) {
        this.property1 = property1;
    }

    public void setProperty2(int property2) {
        this.property2 = property2;
    }

    public void setProperty3(boolean property3) {
        this.property3 = property3;
    }
}

  1. Builder 模式:

特点: 通过一个独立的 Builder 类负责构建对象,通过链式调用设置属性,最后调用 build 方法得到最终的对象。

优点: 提供了更灵活、清晰的构建方式,可以确保对象在构建时处于合法状态,支持链式调用,易于扩展。

缺点: 需要额外的 Builder 类,可能增加代码量。

public class Product {
    private String property1;
    private int property2;
    private boolean property3;

    private Product(ProductBuilder builder) {
        this.property1 = builder.property1;
        this.property2 = builder.property2;
        this.property3 = builder.property3;
    }

     static class ProductBuilder {
        private String property1;
        private int property2;
        private boolean property3;

        public ProductBuilder(String property1) {
            this.property1 = property1;
        }

        public ProductBuilder setProperty2(int property2) {
            this.property2 = property2;
            return this;
        }

        public ProductBuilder setProperty3(boolean property3) {
            this.property3 = property3;
            return this;
        }

        public Product build() {
            return new Product(this);
        }
    }
}

总结:

  • 重叠构造器模式简单直观,但难以维护;
  • JavaBeans 模式灵活,但可能导致对象状态不完整和可变性问题;
  • Builder 模式提供了更清晰、灵活的构建方式,支持链式调用,更易于维护和扩展。

builder模式优缺点

Builder 模式是一种创建对象的设计模式,通过将一个复杂对象的构建过程拆解成一系列简单的步骤,使得构建过程更加灵活、可读、易于扩展。以下是 Builder 模式的一些优缺点:

优点:

  1. 链式调用: Builder 模式通常支持链式调用,使得构建过程更加清晰、直观。这种风格的代码更易于阅读和理解。
Product product = new ProductBuilder()
    .setProperty1("value1")
    .setProperty2("value2")
    .setProperty3("value3")
    .build();
  1. 可读性和可维护性: Builder 模式提供了一种清晰的、面向用户的 API,使得客户端代码更易于理解。构建过程的每一步都以简洁的方式表达,这有助于代码的可读性和可维护性。
  2. 可选参数: Builder 模式允许客户端代码只设置感兴趣的属性,而不必关心其他属性。这种方式下,构建器模式可以轻松地处理有默认值和可选参数的对象。
  3. 不可变性: 如果 Builder 模式创建的对象是不可变的,那么它可以在多线程环境中更安全地使用。
  4. 构建复杂对象: 适用于构建复杂对象的场景,特别是当对象有很多可选参数、有复杂的构建过程、或需要支持多个变种时。
  5. 更好的扩展性: 可以通过扩展 Builder 类来支持新的构建步骤,或者通过引入不同的具体 Builder 类来构建不同的对象变种。

缺点:

  1. 代码量增加: 使用 Builder 模式通常会引入额外的代码,包括建造者类本身以及目标类中的 setter 方法。这可能增加代码量,尤其是对于简单的对象而言。
  2. 对象状态分散: 在 Builder 模式中,对象的状态可能分散在构建器和目标类中。这使得对象的状态分散,可能使得维护和修改代码更加困难。
  3. 可能导致过多的类: 如果每个类都需要一个独立的建造者,可能会导致类的数量激增,增加了类的管理和维护的复杂性。
  4. 不适用于不可变对象: 如果目标类本身是不可变的,那么引入 Builder 模式可能显得过于繁琐,因为不可变对象通常通过构造函数一次性初始化。

总体而言,Builder 模式是一个强大而灵活的设计模式,适用于需要构建复杂对象的场景。选择是否使用 Builder 模式应该根据具体的需求和设计目标来决定。

想法:

1、限定构造函数初始化,其实就是限定了 这个对象成员变量被共享的途径。每个对象在赋值的时候 只能通过构造进行操作

2、上面的想法也论证了为什么builder模式在多线程场景更加的安全

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐