设计模式之建造者模式

建造者模式是一种创建型设计模式,用于构建复杂对象,允许在不改变构建过程的情况下更改产品的内部表示。本文详细介绍了建造者模式的原理、使用场景及与工厂模式的区别,并通过一个线程池配置类的示例展示了其具体应用。

什么是建造者模式

建造者模式,或者说是构建者模式,是一种创建型模式。建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
(建造者模式就是如何一步步构建包含多个组件的对象,相同的创建过程可以创建不同的产品,适用于流程固定但顺序不一定固定的对象,比如做一盘菜,有人喜欢先放盐,有人喜欢后放盐,都没关系,但放盐这个过程是一定要有的)

建造者模式使用场景

一般创建对象我们最常用的方式是直接使用new调用对象的构造函数。但是如果创建的是一个参数较多的复杂对象呢?如果通过构造函数直接new的话,代码的可读性和易用性都会变差,而且容易搞错各个参数的顺序,传递进错误的参数值,造成一些不容易发现的bug。如果不用构造函数传递所有的参数,而是通过构造函数传递必填的参数,通过set设置选填的参数,又会有新的问题,那就是如果必填项很多呢?如果非必填项需要校验呢?如果希望对象创建出来之后不可变呢?这时候,建造者模式就派上用场了。建造者模式的使用场景也就清晰了。

那建造者模式和工厂模式有什么区别呢?
工厂模式是用来创建一组类型相关的对象(继承同一父类或接口的一组子类),通过给定的参数决定创建哪种类型的对象。而建造者模式是用来创建一种类型的复杂对象,通过参数的不同,定制化地创建不同的对象。

建造者模式示例

比如要实现一个线程池配置类。有name(资源名称)、maxTotal (最大线程数)、minIdle(最小空闲线程数)、maxIdle(最大空闲线程数)。name必填,maxTotal非必填默认8,maxIdle非必填默认8,minIdle非必填默认0。

通过建造者模式,可以将各个参数的校验逻辑放在Builder类的build()方法中,在对象创建前做集中校验。且将构造函数设为private,实现对象不可变,只能通过构建者类创建对象。

public class ResourcePoolConfig{
	private String name;
	private int maxTotal;
	private int maxIdle;
	private int minIdle;	
	
	private ResourcePoolConfig(Builder builder){
		this.name = builder.name;
		this.maxTotal = builder.maxTotal;
		this.maxIdle = builder.maxIdle;
		this.minIdle = builder.minIdle;
	}
	//省略getter方法
	
	//内部Builder类
	public static class Builder{
		private static final int DEFAULT_MAX_TOTAL = 8;
		private static final int DEFAULT_MAX_IDLE = 8;
		private static final int DEFAULT_MIN_IDLE = 0;
		
		private String name;
		private int maxTotal = DEFAULT_MAX_TOTAL;
		private int maxIdle = DEFAULT_MAX_IDLE;
		private int minIdle = DEFAULT_MIN_IDLE;

		public ResourcePoolConfig build(){
			//校验逻辑在build方法做
			if(StringUtils.isBlank(name)){
				throw new IllegalArgumentException("...");
			}
			if(maxIdle > maxTotal){
				throw new IllegalArgumentException("...");
			}
			if(minIdle > maxTotal || minIdle > maxIdle){
				throw new IllegalArgumentException("...");
			}
			return new ResourcePoolConfig(this);
		}
		public Builder setName(String name){
			if(StringUtils.isBlank(name)){
				throw new IllegalArgumentException("...");
			}
			this.name = name;
			return this;
		}
		public Builder setMaxTotal(int maxTotal){
			if(maxTotal <= 0){
				throw new IllegalArgumentException("...");
			}
			this.maxTotal = maxTotal;
			return this;
		}
		public Builder setMaxIdle(int maxIdle){
			if(maxIdle <= 0){
				throw new IllegalArgumentException("...");
			}
			this.maxIdle = maxIdle;
			return this;
		}
		public Builder setMinIdle(int minIdle){
			if(minIdle <= 0){
				throw new IllegalArgumentException("...");
			}
			this.minIdle = minIdle;
			return this;
		}
	}
}

//客户端
ResourcePoolConfig config = new ResourcePoolConfig.Builder()
	.setName("testPool")
	.setMaxTotal(16)
	.setMaxIdle(10)
	.setMinIdle(12)
	.build()

可以发现,建造者模式的Builder类必须包含被创建对象的所有属性。如果对象的属性发生变化,那建造者类就需要做相应的修改。

建造者模式UML类图

以下是经典构建者模式类图:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值