Java 中的 Builder 设计模式
今天我们将研究 Java 中的 Builder 模式。Builder 设计模式是一种创建型设计模式,类似于工厂模式和抽象工厂模式。
建造者设计模式
引入建造者模式是为了解决工厂和抽象工厂设计模式在对象包含大量属性时出现的一些问题。当对象包含大量属性时,工厂和抽象工厂设计模式存在三个主要问题。
- 从客户端程序传递给工厂类的参数太多,这很容易出错,因为大多数情况下,参数的类型是相同的,并且从客户端很难维护参数的顺序。
- 一些参数可能是可选的,但在工厂模式中,我们被迫发送所有参数,并且可选参数需要以 NULL 发送。
- 如果对象很重并且其创建很复杂,那么所有的复杂性都将成为令人困惑的工厂类的一部分。
我们可以通过提供具有必需参数的构造函数来解决大量参数的问题,然后提供不同的 setter 方法来设置可选参数。这种方法的问题在于,除非明确设置所有属性,否则对象状态将不一致。构建器模式通过提供一种逐步构建对象的方法并提供一种实际返回最终对象的方法,解决了大量可选参数和不一致状态的问题。
Java 中的建造者设计模式
让我们看看如何在 Java 中实现构建器设计模式。
- 首先,您需要创建一个静态嵌套类,然后将所有参数从外部类复制到 Builder 类。我们应该遵循命名约定,如果类名为,
Computer
则 builder 类应命名为ComputerBuilder
。 - Java Builder 类应该有一个公共构造函数,并将所有必需的属性作为参数。
- Java Builder 类应该具有设置可选参数的方法,并且在设置可选属性后应该返回相同的 Builder 对象。
- 最后一步是在构建器类中提供一个
build()
方法,该方法将返回客户端程序所需的对象。为此,我们需要在类中有一个私有构造函数,并以 Builder 类作为参数。
下面是示例构建器模式示例代码,其中我们有一个 Computer 类和 ComputerBuilder 类来构建它。
package com.journaldev.design.builder;
public class Computer {
//required parameters
private String HDD;
private String RAM;
//optional parameters
private boolean isGraphicsCardEnabled;
private boolean isBluetoothEnabled;
public String getHDD() {
return HDD;
}
public String getRAM() {
return RAM;
}
public boolean isGraphicsCardEnabled() {
return isGraphicsCardEnabled;
}
public boolean isBluetoothEnabled() {
return isBluetoothEnabled;
}
private Computer(ComputerBuilder builder) {
this.HDD=builder.HDD;
this.RAM=builder.RAM;
this.isGraphicsCardEnabled=builder.isGraphicsCardEnabled;
this.isBluetoothEnabled=builder.isBluetoothEnabled;
}
//Builder Class
public static class ComputerBuilder{
// required parameters
private String HDD;
private String RAM;
// optional parameters
private boolean isGraphicsCardEnabled;
private boolean isBluetoothEnabled;
public ComputerBuilder(String hdd, String ram){
this.HDD=hdd;
this.RAM=ram;
}
public ComputerBuilder setGraphicsCardEnabled(boolean isGraphicsCardEnabled) {
this.isGraphicsCardEnabled = isGraphicsCardEnabled;
return this;
}
public ComputerBuilder setBluetoothEnabled(boolean isBluetoothEnabled) {
this.isBluetoothEnabled = isBluetoothEnabled;
return this;
}
public Computer build(){
return new Computer(this);
}
}
}
请注意,Computer 类只有 getter 方法,没有公共构造函数。因此,获取 Computer 对象的唯一方法是通过 ComputerBuilder 类。下面是一个构建器模式示例测试程序,展示了如何使用 Builder 类获取对象。
package com.journaldev.design.test;
import com.journaldev.design.builder.Computer;
public class TestBuilderPattern {
public static void main(String[] args) {
//Using builder to get the object in a single line of code and
//without any inconsistent state or arguments management issues
Computer comp = new Computer.ComputerBuilder(
"500 GB", "2 GB").setBluetoothEnabled(true)
.setGraphicsCardEnabled(true).build();
}
}
建造者设计模式视频教程
最近,我上传了一个有关 Builder 设计模式的 YouTube 视频。我还解释了为什么我认为WikiPedia 上使用 Director类定义的构建器模式不是一种很好的面向对象方法,以及我们如何使用不同的方法和一个类来实现相同的抽象级别。请注意,这是我的观点,我觉得设计模式是为了指导我们,但最终我们必须决定在我们的项目中实现它是否真的有益。我坚信KISS 原则。https ://www.youtube.com/watch?v =D5NK5qMM14g 如果您喜欢该视频,请分享、点赞并订阅我的频道。如果您认为我错了,或者您有任何意见或反馈,以便我将来改进我的视频,请通过此处或 YouTube 视频页面上的评论告诉我。
JDK 中的 Builder 设计模式示例
Java 类中的一些构建器模式示例是;
- java.lang.StringBuilder#append() (不同步)
- java.lang.StringBuffer#append() (同步)
这就是 Java 中的构建器设计模式的全部内容。
您可以从我的GitHub 存储库下载示例代码。