设计模式-builder模式

本文探讨了Builder模式在创建对象时的使用场景,强调了其优点如链式调用、可读性强和易于扩展,同时也指出了缺点如代码量增加和对象状态分散。比较了重叠构造器模式和JavaBeans模式,以帮助开发者根据项目需求选择合适的设计策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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模式在多线程场景更加的安全

<think>我们正在讨论Android开发中的Builder设计模式。根据引用内容,Builder模式主要用于构建复杂对象,通过链式调用设置参数,最后通过build方法创建对象实例。实现细节包括:1.私有化目标类的构造方法,使其只能通过内部Builder类构建。2.静态内部类Builder,它拥有与目标类相同的字段,并提供设置这些字段的方法(每个方法返回Builder自身以实现链式调用)。3.Builder类提供一个build方法,在该方法中调用目标类的私有构造方法(将Builder自身作为参数传入),在目标类的构造方法中完成字段的复制。4.目标类一旦创建,其参数不可更改(即不可变)。在Android中,AlertDialog就是使用Builder模式的经典例子。现在,我们按照用户要求,详细说明Builder模式的使用与实现。</think>### Android Builder设计模式的使用与实现 Builder设计模式是一种创建型模式,用于**分步构建复杂对象**,特别适用于参数众多或配置灵活的场景。在Android开发中,Builder模式被广泛应用于对话框创建、网络请求配置等场景。 #### 一、核心实现原理 1. **私有化构造方法** 目标类的构造方法设为私有,禁止直接实例化。 ```java public class User { private final String name; // final确保不可变 private final int age; private User(Builder builder) { // 私有构造器 this.name = builder.name; this.age = builder.age; } } ``` 2. **静态内部Builder类** 作为构建桥梁,持有与目标类相同的字段: ```java public static class Builder { private String name; private int age; public Builder setName(String name) { this.name = name; return this; // 返回自身实现链式调用 } public Builder setAge(int age) { this.age = age; return this; } public User build() { return new User(this); // 调用私有构造器 } } ``` #### 二、Android经典应用:AlertDialog ```java // 使用示例 AlertDialog dialog = new AlertDialog.Builder(context) .setTitle("警告") .setMessage("确认删除?") .setPositiveButton("确定", (d, which) -> { /* 逻辑 */ }) .setNegativeButton("取消", null) .create(); // 最终构建对象 ``` **实现解析**(参考引用[2][4]): 1. `AlertDialog`构造器私有化,只能通过`Builder`构建 2. `Builder`的每个set方法返回自身,支持链式调用 3. `create()`方法调用`AlertDialog`私有构造器并传入配置参数 4. 最终通过`show()`将Dialog添加到WindowManager[^4] #### 三、自定义Builder模式实现 以构建用户对象为例: ```java public class User { private final String name; private final int age; private final String email; private User(Builder builder) { this.name = builder.name; this.age = builder.age; this.email = builder.email; } public static class Builder { private String name; private int age; private String email = ""; // 默认值 public Builder setName(String name) { this.name = name; return this; } public Builder setAge(int age) { if (age < 0) throw new IllegalArgumentException("年龄无效"); this.age = age; return this; } public Builder setEmail(String email) { this.email = email; return this; } public User build() { if (name == null) throw new IllegalStateException("名称不能为空"); return new User(this); } } } // 使用示例 User user = new User.Builder() .setName("张三") .setAge(30) .setEmail("[email protected]") .build(); ``` #### 四、设计优势 1. **参数解耦**:分离对象构建与参数设置(引用[1]) 2. **链式调用**:提升代码可读性(引用[6]) 3. **对象不可变**:build()后字段final确保线程安全 4. **参数校验**:可在build()方法中集中校验 5. **灵活扩展**:支持可选参数和默认值 #### 五、适用场景 1. 需创建含多个可选参数的对象 2. 要求对象创建后不可修改(不可变对象) 3. 需要分步构建复杂配置(如Retrofit.Builder) 4. 替代冗长的多参数构造方法 > **关键点**:Builder模式通过内部类封装构建逻辑,既保证对象创建的灵活性,又维持了目标类的不可变性。在Android中,除了对话框外,Glide图片加载框架、Retrofit网络库等都广泛采用此模式[^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码匠心印记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值