设计模式是针对最常见的软件问题提供的可重用解决方案。它们通过提供解决常见问题的已证实的方法来加速开发过程。
在这一系列的文章中,我想介绍最常见的设计模式,并提供在 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
结论
构建器模式不仅适用于模型类,而且适用于具有三到四个以上参数的任何对象。通过一些额外的工作,我们可以提高代码的可读性。设计模式被认为是最佳实践,因此如果你知道其中一些模式,则具有很大的优势,而构建器模式是一个很好的入门模式。
评论(0)