设计模式-builder模式

builder模式

使用背景 & 使用场景

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

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

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

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

java 复制代码
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方法修改这个值,可能会存在线程安全问题
java 复制代码
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 类,可能增加代码量。

java 复制代码
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 模式通常支持链式调用,使得构建过程更加清晰、直观。这种风格的代码更易于阅读和理解。
java 复制代码
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模式在多线程场景更加的安全

相关推荐
付聪121030 分钟前
策略模式介绍和代码示例
设计模式
南宫生1 小时前
力扣每日一题【算法学习day.132】
java·学习·算法·leetcode
计算机毕设定制辅导-无忧学长1 小时前
Maven 基础环境搭建与配置(一)
java·maven
ThereIsNoCode2 小时前
「软件设计模式」状态模式(State)
设计模式·状态模式
风与沙的较量丶2 小时前
Java中的局部变量和成员变量在内存中的位置
java·开发语言
m0_748251722 小时前
SpringBoot3 升级介绍
java
极客先躯3 小时前
说说高级java每日一道面试题-2025年2月13日-数据库篇-请说说 MySQL 数据库的锁 ?
java·数据库·mysql·数据库的锁·模式分·粒度分·属性分
程序员侠客行4 小时前
Spring事务原理 二
java·后端·spring
小猫猫猫◍˃ᵕ˂◍4 小时前
备忘录模式:快速恢复原始数据
android·java·备忘录模式
liuyuzhongcc4 小时前
List 接口中的 sort 和 forEach 方法
java·数据结构·python·list