设计模式-builder模式
通过在构造器中传递不同数量的参数,从而实现构建不同属性组合的对象。简单直观,适用于属性较少的情况。随着属性增加,构造器的参数组合呈指数级增长,难以维护和理解。使用默认构造器创建对象,然后通过 setter 方法逐个设置属性的值。灵活性较强,属性可以逐个设置。可能导致对象在构建过程中处于不完整状态,可变性带来的线程安全性问题,无法保证对象的不变性。通过一个独立的 Builder 类负责构建对象,通过
builder模式
使用背景 & 使用场景
- 重叠构造器模式(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;
}
}
- 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;
}
}
- 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 模式的一些优缺点:
优点:
- 链式调用: Builder 模式通常支持链式调用,使得构建过程更加清晰、直观。这种风格的代码更易于阅读和理解。
Product product = new ProductBuilder()
.setProperty1("value1")
.setProperty2("value2")
.setProperty3("value3")
.build();
- 可读性和可维护性: Builder 模式提供了一种清晰的、面向用户的 API,使得客户端代码更易于理解。构建过程的每一步都以简洁的方式表达,这有助于代码的可读性和可维护性。
- 可选参数: Builder 模式允许客户端代码只设置感兴趣的属性,而不必关心其他属性。这种方式下,构建器模式可以轻松地处理有默认值和可选参数的对象。
- 不可变性: 如果 Builder 模式创建的对象是不可变的,那么它可以在多线程环境中更安全地使用。
- 构建复杂对象: 适用于构建复杂对象的场景,特别是当对象有很多可选参数、有复杂的构建过程、或需要支持多个变种时。
- 更好的扩展性: 可以通过扩展 Builder 类来支持新的构建步骤,或者通过引入不同的具体 Builder 类来构建不同的对象变种。
缺点:
- 代码量增加: 使用 Builder 模式通常会引入额外的代码,包括建造者类本身以及目标类中的 setter 方法。这可能增加代码量,尤其是对于简单的对象而言。
- 对象状态分散: 在 Builder 模式中,对象的状态可能分散在构建器和目标类中。这使得对象的状态分散,可能使得维护和修改代码更加困难。
- 可能导致过多的类: 如果每个类都需要一个独立的建造者,可能会导致类的数量激增,增加了类的管理和维护的复杂性。
- 不适用于不可变对象: 如果目标类本身是不可变的,那么引入 Builder 模式可能显得过于繁琐,因为不可变对象通常通过构造函数一次性初始化。
总体而言,Builder 模式是一个强大而灵活的设计模式,适用于需要构建复杂对象的场景。选择是否使用 Builder 模式应该根据具体的需求和设计目标来决定。
想法:
1、限定构造函数初始化,其实就是限定了 这个对象成员变量被共享的途径。每个对象在赋值的时候 只能通过构造进行操作
2、上面的想法也论证了为什么builder模式在多线程场景更加的安全
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)