模式定义: 将一个复杂对象的构建与他的表示分离,使得可以使用同样的构建构成构成不同的表示。这里呢以“色彩斑斓”作为建造者模式的一个比喻。就好比我们的颜色组成一样,同样是RGB三部分组成,不同的RGB值就能组成不同的颜色。
涉及到的有4个模型:
- 产品模型: 特定的产品,具有复杂的组成部分,需要建造的实例;
- 抽象建造者: 规范产品模型的各个组成部分,并进行抽象;
- 具体建造者: 实现抽象建造模型的所有方法,并且提供一个创建好的产品对象;
- 导演者(或生产者)模型: 负责产品部分建造的顺序;
列个demo。先是产品模型,有abcde等几种部分(零件):
public class Product {
private String a;
private String b;
private String c;
private String d;
private String e;
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
public String getB() {
return b;
}
public void setB(String b) {
this.b = b;
}
public String getC() {
return c;
}
public void setC(String c) {
this.c = c;
}
public String getD() {
return d;
}
public void setD(String d) {
this.d = d;
}
public String getE() {
return e;
}
public void setE(String e) {
this.e = e;
}
}
抽象建造者:
public abstract class Builder {
protected Product product;
abstract void setProductA();
abstract void setProductB();
abstract void setProductC();
abstract void setProductD();
abstract void setProductE();
public Product getProduct() {
return product;
}
}
具体建造者,提供抽象建造者方法的全部具体实现。
public class BuilderImpl extends Builder {
@Override
void setProductA() {
product.setA("a");
}
@Override
void setProductB() {
product.setA("b");
}
@Override
void setProductC() {
product.setA("c");
}
@Override
void setProductD() {
product.setA("d");
}
@Override
void setProductE() {
product.setA("e");
}
}
导演者或者指挥者,开始构建:
public class Director {
private Builder builder;
public Director() {
builder = new BuilderImpl();
}
public Product buildA() {
builder.setProductA();
builder.setProductD();
builder.setProductC();
// ...省略其他构建
return builder.getProduct();
}
}
最后是作为客户端(调用者)开发者的使用,就获取到了产品Product的实例了。
Director dic = new Director();
Product product = dic.buildA();
应用场景:
- 相同的方法,不同的执行顺序产生不同的结果;
- 产品很复杂,多种部件(属性),不同的组合方式产生不同的结果;
优点:
- 良好的封装性,隐藏内部细节,安全性提高;
- 部件独立组装,扩展性强;
缺点:
- 产品类型固定,限制产品层次的扩展;
- 有大量零件时,增加零件组装的复杂难度;
小结 :建造者是一种创建型设计模式,针对那些构成复杂又多变的对象有奇效。很多时候我们需要建造的产品就只有一个,就可以将抽象建造者这个角色模型省略掉。并且还可以将导演者角色模型与具体建造者模型结合成一个模型角色来使用,设计成一种链式结构的调用体系。就像Dialog的创建。