什么是建造者模式
建造者模式,或者说是构建者模式,是一种创建型模式。建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
(建造者模式就是如何一步步构建包含多个组件的对象,相同的创建过程可以创建不同的产品,适用于流程固定但顺序不一定固定的对象,比如做一盘菜,有人喜欢先放盐,有人喜欢后放盐,都没关系,但放盐这个过程是一定要有的)
建造者模式使用场景
一般创建对象我们最常用的方式是直接使用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类图
以下是经典构建者模式类图:

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

被折叠的 条评论
为什么被折叠?



