Java中的生成器设计模式

时间:2020-02-23 14:33:57  来源:igfitidea点击:

今天,我们将研究Java中的Builder模式。
生成器设计模式是一种创新的设计模式,例如工厂模式和抽象工厂模式。

生成器设计模式

当对象包含很多属性时,引入了构建器模式来解决工厂和抽象工厂设计模式的一些问题。

当对象包含很多属性时,工厂和抽象工厂设计模式存在三个主要问题。

  • 从客户端程序传递到Factory类的参数过多,这很容易出错,因为在大多数情况下,参数的类型是相同的,并且从客户端很难保持参数的顺序。

  • 一些参数可能是可选的,但是在出厂模式下,我们被迫发送所有参数,而可选参数需要以NULL的形式发送。

  • 如果对象很重且其创建很复杂,那么所有这些复杂性将成为混淆的Factory类的一部分。

通过为构造函数提供必需的参数,然后提供不同的setter方法来设置可选参数,我们可以解决大量参数的问题。
这种方法的问题在于,除非明确设置所有属性,否则对象状态将一直不一致。

Builder模式通过提供一种逐步构建对象并提供一种将实际返回最终Object的方法的方式,解决了具有大量可选参数和状态不一致的问题。

Java中的生成器设计模式

让我们看看如何在Java中实现构建器设计模式。

  • 首先,您需要创建一个静态嵌套类,然后将所有参数从外部类复制到Builder类。
    我们应该遵循命名约定,如果类名称为Computer,则构建器类应命名为ComputerBuilder

  • Java Builder类应具有一个公共构造函数,其中带有所有必需的属性作为参数。

  • Java Builder类应具有设置可选参数的方法,并且应在设置可选属性后返回相同的Builder对象。

  • 最后一步是在builder类中提供一个build()方法,该方法将返回客户端程序所需的Object。
    为此,我们需要在Class中有一个带有Builder类作为参数的私有构造函数。

这是示例构建器模式示例代码,其中有一个Computer类和ComputerBuilder类来构建它。

package com.theitroad.design.builder;

public class Computer {
	
	//required parameters
	private String HDD;
	private String 内存;
	
	//optional parameters
	private boolean isGraphicsCardEnabled;
	private boolean isBluetoothEnabled;
	

	public String getHDD() {
		return HDD;
	}

	public String get内存() {
		return 内存;
	}

	public boolean isGraphicsCardEnabled() {
		return isGraphicsCardEnabled;
	}

	public boolean isBluetoothEnabled() {
		return isBluetoothEnabled;
	}
	
	private Computer(ComputerBuilder builder) {
		this.HDD=builder.HDD;
		this.内存=builder.内存;
		this.isGraphicsCardEnabled=builder.isGraphicsCardEnabled;
		this.isBluetoothEnabled=builder.isBluetoothEnabled;
	}
	
	//Builder Class
	public static class ComputerBuilder{

		//required parameters
		private String HDD;
		private String 内存;

		//optional parameters
		private boolean isGraphicsCardEnabled;
		private boolean isBluetoothEnabled;
		
		public ComputerBuilder(String hdd, String ram){
			this.HDD=hdd;
			this.内存=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.theitroad.design.test;

import com.theitroad.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视频。
我还解释了为什么我认为使用Director类在WikiPedia上定义的构建器模式不是一种非常好的面向对象的方法,以及如何使用不同的方法和一个类来实现相同的抽象级别。

请注意,这是我的观点,我认为设计模式可以为我们提供指导,但是最终我们必须确定在我们的项目中实施它是否真的有益。
我坚信KISS原则。

如果您喜欢该视频,请共享它并订阅我的频道。
如果您认为我有误,或者有任何意见或者反馈,以便将来可以改进我的视频,请通过此处或者YouTube视频页面上的注释让我知道。

JDK中的Builder设计模式示例

Java类中的一些构建器模式示例为:

  • java.lang.StringBuilder#append()(未同步)
  • java.lang.StringBuffer#append()(已同步)

这就是Java中的构建器设计模式。