Builder 模式,中文翻译为建造者模式或者构建者模式,也有人叫它生成器模式。 实际上,建造者模式的原理和代码实现非常简单,掌握起来并不难,难点在于应用场景。
直接使用构造函数或者配合 set 方法就能创建对象,为什么还需要建造者模式来创建呢?
除此之外,在今天的讲解中,我们还对比了工厂模式和建造者模式的区别。工厂模式是用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象。建造者模式是用来创建一种类型的复杂对象,可以通过设置不同的可选参数,“定制化”地创建不同的对象。
为了解决这些问题,建造者模式就派上用场了。 使用方法:
建造者模式和工厂模式都可以创建对象,那它们两个的区别在哪里呢? 工厂模式是用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象。建造者模式是用来创建一种类型的复杂对象,可以通过设置不同的可选参数,“定制化”地创建不同的对象。
package build;
public class ResourcePoolConfig2 {
private String name;
private int maxTotal;
private int maxIdle;
private int minIdle;
// 私有化构造
private ResourcePoolConfig2(Builder builder) {
this.name = builder.name;
this.maxTotal = builder.maxTotal;
this.maxIdle = builder.maxIdle;
this.minIdle = builder.minIdle;
}
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 Integer maxTotal = DEFAULT_MAX_TOTAL;
private Integer maxIdle = DEFAULT_MAX_IDLE;
private Integer minIdle = DEFAULT_MIN_IDLE;
public Builder setName(String name) {
this.name = name;
return this;
}
public Builder setMaxTotal(Integer maxTotal) {
this.maxTotal = maxTotal;
return this;
}
public Builder setMaxIdle(Integer maxIdle) {
this.maxIdle = maxIdle;
return this;
}
public Builder setMinIdle(Integer minIdle) {
this.minIdle = minIdle;
return this;
}
public ResourcePoolConfig2 build() {
// 校验逻辑放到这里来做,包括必填项校验、依赖关系校验、约束条件校验等
if (null == name) {
throw new IllegalArgumentException("name should not be empty.");
}
if (maxTotal != null) {
if (maxTotal <= 0) {
throw new IllegalArgumentException("maxTotal should be positive.");
}
}
if (maxIdle != null) {
if (maxIdle < 0) {
throw new IllegalArgumentException("maxIdle should not be negative.");
}
}
if (minIdle != null) {
if (minIdle < 0) {
throw new IllegalArgumentException("minIdle should not be negative.");
}
}
if (maxIdle > maxTotal) {
throw new IllegalArgumentException("...");
}
if (minIdle > maxTotal || minIdle > maxIdle) {
throw new IllegalArgumentException("...");
}
return new ResourcePoolConfig2(this);
}
}
}设计模式之美设计模式代码重构-极客时间 https://time.geekbang.org/column/intro/250