首页
Preview

Android中的设计模式 —— 建造者模式

设计模式是针对最常见的软件问题提供的可重用解决方案。它们通过提供解决常见问题的已证实的方法来加速开发过程。

在这一系列的文章中,我想介绍最常见的设计模式,并提供在 Android 中实现的示例。

介绍

设计模式可以分为三个部分:

  • 创建型模式 提供创建类、对象的解决方案(如单例、工厂、构建器等)
  • 结构型模式 关注类和对象的排列(如组合、外观、适配器)
  • 行为型模式 提供了在对象和类之间通信的方式(如命令、观察者、策略等)

构建器模式

构建器模式以非常简洁和易读的方式简化了对象的创建。当我们有一些带有多个参数的模型类时,它非常有帮助。我们可以使其中一些参数是可选的或必需的,并且不强制用户使用特定的顺序(如在构造函数中)。通过使用构建器模式,我们得到了优雅的方法链。最常见的用法是在 AlertDialog.Builder() 类中:

new AlertDialog.Builder(this)
        .setTitle("Design Patterns")
        .setMessage("Builder is awesome")
        .create();

我们如何为自己的使用创建构建器类?

实践中的构建器模式

假设我们有一个用户的模型类:

public class User {
    private String firstName;
    private String lastName;
    private int age;
}

我们想要使用构建器模式创建该类的对象,而不是使用构造函数,像这样:

new User.Builder()
        .setFirstName("Leonardo")
        .setLastName("da Vinci")
        .setAge(67)
        .create();

我们该如何做呢?首先,我们需要在 User 类内部创建 Builder 类,它将具有构建对象所需的方法。具有链接方法的关键是构建器方法返回 Builder 类型。请看以下示例:

static class Builder {
    private String firstName;
    private String lastName;
    private int age;

    public Builder setFirstName(final String firstName) {
        this.firstName = firstName;
        return this;
    }

    public Builder setLastName(final String lastName) {
        this.lastName = lastName;
        return this;
    }

    public Builder setAge(final int age) {
        this.age = age;
        return this;
    }

    public User create() {
        return new User(this);
    }
}

对于每个参数,我们都有一个 setter,不同之处在于这些方法返回 Builder 类型。最后,我们有一个使用 User 类中的构造函数并返回 User 对象的方法,这里是我们的混乱被隐藏的地方。

然后,我们需要在模型类 User 中创建带有所有参数的构造函数:

public class User {
    private String firstName;
    private String lastName;
    private int age;

    private User(final Builder builder) {
        firstName = builder.firstName;
        lastName = builder.lastName;
        age = builder.age;
    }
}

这里的重要事项是 User 构造函数是私有的,因此无法从其他类访问,我们必须使用 Builder 来创建新对象。

当然,我们可以通过修改 create() 方法并抛出一些异常(例如,现在所有参数都是可选的)来使某些参数为必需的。

public User create() {
    User user = new User(firstName, lastName, age);
    if (user.firstName.isEmpty()) {
        throw new IllegalStateException(
           "First name can not be empty!");
    }
    return user;
}

就是这样。这样我们创建了我们的 User.Builder() 类!

构建器模式技巧

如果你耐心阅读了整篇博客文章,我有一个关于构建器模式的提示:你可以使用 IntelliJ 生成整个构建器类!

你需要做的就是将光标放在类中的构造函数上,然后在上下文菜单中选择 重构 -> 用构建器替换构造函数。构建器类将自动生成,准备就绪。

你可以在此处阅读更多信息:IntelliJ: Replace Constructor with Builder

结论

构建器模式不仅适用于模型类,而且适用于具有三到四个以上参数的任何对象。通过一些额外的工作,我们可以提高代码的可读性。设计模式被认为是最佳实践,因此如果你知道其中一些模式,则具有很大的优势,而构建器模式是一个很好的入门模式。

版权声明:本文内容由TeHub注册用户自发贡献,版权归原作者所有,TeHub社区不拥有其著作权,亦不承担相应法律责任。 如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

点赞(0)
收藏(0)
阿波
The minute I see you, I want your clothes gone!

评论(0)

添加评论