今天,我们将研究Java中的构建器模式。Builder设计模式是一种创造性设计模式 ,类似于** Factory Pattern** 和** Abstract Factory Pattern** 。
构建器设计模式
Builder模式是为了解决当对象包含大量属性时工厂和抽象工厂设计模式的一些问题。当对象包含许多属性时,工厂和抽象工厂设计模式有三个主要问题。
1.从客户端程序传递到Factory类的参数太多,这可能容易出错,因为大多数时候,参数的类型是相同的,并且从客户端很难维护参数的顺序。 2.有些参数可能是可选的,但在工厂模式中,我们被迫发送所有参数,可选参数需要作为NULL发送。 3.如果对象很重,并且它的创建很复杂,那么所有这些复杂性都将是混淆的Factory类的一部分。
我们可以通过为构造函数提供所需的参数,然后使用不同的setter方法来设置可选参数,从而解决参数数量多的问题。这种方法的问题是,除非显式设置了所有属性,否则对象状态将是不一致 。构建器模式通过提供一种逐步构建对象的方法并提供实际返回最终对象的方法来解决具有大量可选参数和不一致状态的问题。
Java中的Builder设计模式
让我们看看如何在Java中实现构建器设计模式。
1.首先,您需要创建一个静态嵌套类,然后将外部类的所有参数复制到Builder类中。我们应该遵循命名约定,如果类名是Computer
,则生成器类应该命名为ComputerBuilder
。
2.Java Builder类应该有一个公共构造函数,所有必需的属性都作为参数。
3.Java Builder类应该有设置可选参数的方法,并在设置可选属性后返回相同的Builder对象。
4.最后一步是在Builder类中提供一个Build()
方法,该方法将返回客户端程序需要的对象。为此,我们需要在使用Builder类作为参数的类中有一个私有构造函数。
以下是示例构建器模式示例代码,其中我们有一个Computer类和ComputerBuilder类来构建它。
1package com.journaldev.design.builder;
2
3public class Computer {
4
5 //required parameters
6 private String HDD;
7 private String RAM;
8
9 //optional parameters
10 private boolean isGraphicsCardEnabled;
11 private boolean isBluetoothEnabled;
12
13
14 public String getHDD() {
15 return HDD;
16 }
17
18 public String getRAM() {
19 return RAM;
20 }
21
22 public boolean isGraphicsCardEnabled() {
23 return isGraphicsCardEnabled;
24 }
25
26 public boolean isBluetoothEnabled() {
27 return isBluetoothEnabled;
28 }
29
30 private Computer(ComputerBuilder builder) {
31 this.HDD=builder.HDD;
32 this.RAM=builder.RAM;
33 this.isGraphicsCardEnabled=builder.isGraphicsCardEnabled;
34 this.isBluetoothEnabled=builder.isBluetoothEnabled;
35 }
36
37 //Builder Class
38 public static class ComputerBuilder{
39
40 // required parameters
41 private String HDD;
42 private String RAM;
43
44 // optional parameters
45 private boolean isGraphicsCardEnabled;
46 private boolean isBluetoothEnabled;
47
48 public ComputerBuilder(String hdd, String ram){
49 this.HDD=hdd;
50 this.RAM=ram;
51 }
52
53 public ComputerBuilder setGraphicsCardEnabled(boolean isGraphicsCardEnabled) {
54 this.isGraphicsCardEnabled = isGraphicsCardEnabled;
55 return this;
56 }
57
58 public ComputerBuilder setBluetoothEnabled(boolean isBluetoothEnabled) {
59 this.isBluetoothEnabled = isBluetoothEnabled;
60 return this;
61 }
62
63 public Computer build(){
64 return new Computer(this);
65 }
66
67 }
68
69}
请注意,Computer类只有getter方法,没有公共构造函数。因此,获取计算机对象的唯一方法是通过ComputerBuilder类。下面是一个构建器模式示例测试程序,展示了如何使用Builder类来获取对象。
1package com.journaldev.design.test;
2
3import com.journaldev.design.builder.Computer;
4
5public class TestBuilderPattern {
6
7 public static void main(String[] args) {
8 //Using builder to get the object in a single line of code and
9 //without any inconsistent state or arguments management issues
10 Computer comp = new Computer.ComputerBuilder(
11 "500 GB", "2 GB").setBluetoothEnabled(true)
12 .setGraphicsCardEnabled(true).build();
13 }
14
15}
Builder设计模式视频教程
最近,我上传了一段YouTube视频,介绍了Builder设计模式。我还解释了为什么我认为维基百科使用Director classes定义的构建器模式不是一个非常好的面向对象的方法,以及我们如何使用不同的方法和一个类来实现相同级别的抽象。请注意,这是我的观点,我觉得设计模式将指导我们,但最终我们必须决定在我们的项目中实现它是否真的有好处。我是KISS principle.]的坚定信徒Https://www.youtube.com/watch?v=D5NK5qMM14g如果你喜欢这段视频,请一定要分享,喜欢它,并订阅我的频道。如果你认为我错了,或者你有任何意见或反馈,以便我以后能改进我的视频,请通过这里或YouTube视频页面的评论让我知道。
JDK中的Builder设计模式示例
Java类中的一些构建器模式示例是;
- java.lang.StringBuilder# append()(未同步)
- java.lang.StringBuffer# append()(已同步)
这就是Java中的构建器设计模式。
您可以从我的giHub Repository.]下载示例代码