1.定义
与抽象工厂模式相比, 建造者模式返回一个组装好的完整产品 ,而抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族。如果将抽象工厂模式看成 汽车配件生产工厂 ,生产一个产品族的产品,那么建造者模式就是一个 汽车组装工厂 ,通过对部件的组装可以返回一辆完整的汽车。
建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式。
2.结构
建造者模式包含如下角色:
- Builder(抽象建造者):声明创建一个产品Product对象的各个部件抽象的接口,在该接口中一般声明两类方法,一类方法是buildPartX(),它们用于创建复杂对象的各个部件;另一类方法是getResult(),它们用于返回复杂对象。
- ConcreteBuilder(具体建造者):Builder接口的具体实现。
- Director(指挥者):又称为导演类,它负责安排复杂对象的建造次序。
- Product(产品角色):被构建的复杂对象(通常指包含多个成员属性的对象)。
3.分析
- 在建造者模式中, 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
- 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,每一个具体建造者都相对独立。
- 实际应用中,常常让Builder角色扮演指挥者与建造者双重角色,让构建过程更灵活
4.适用环境
- 需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。
- 需要生成的产品对象的属性相互依赖,需要指定其生成顺序。
- 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
5.模式实践
使用StringBuilder来构建String
- java.lang.StringBuilder继承实现关系图
- 其中java.lang.Appendable接口提供了以下建造方法
- java.lang.AbstractStringBuilder和java.lang.StringBuilder对以上建造方法进行了实现和扩展。
@Override
public AbstractStringBuilder append(CharSequence s) {
if (s == null)
return appendNull();
if (s instanceof String)
return this.append((String)s);
if (s instanceof AbstractStringBuilder)
return this.append((AbstractStringBuilder)s);
return this.append(s, 0, s.length());
}
//省略。。。
@Override
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
值得注意的是:StringBuilder同时扮演指挥者与建造者双重角色,每个建造方法通过返回当前建造者自身来调用下一个建造方法或返回产品实例String对象。