建造者模式,属于创建型模式。将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。
当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。

首先对于复杂对象Product的创建,我们需要定义组件抽象实现Builder,然后需要不同的组件具体实现方式ConcreteBuilder1和ConcreteBuilder2,然后需要指挥者Director负责装配这些组件(为了简化代码,Director可以直接集成在builder或者product中,如果装配逻辑十分繁杂,建议还是单独定义Director进行装配)。
// 对象
public class Product {
private List<String> parts = new ArrayList<>();
public void addPart(String part) {
parts.add(part);
}
@Override
public String toString() {
return "Product{" +
"parts=" + parts +
'}';
}
}
// 组件抽象实现
public abstract class Builder {
public abstract void buildPartA();
public abstract void buildPartB();
public abstract void buildPartC();
}
// 组件具体实现
public class ConcreteBuilder1 extends Builder{
private Product product = new Product();
@Override
public void buildPartA() {
product.addPart("part A");
}
@Override
public void buildPartB() {
product.addPart("part B");
}
@Override
public void buildPartC() {
product.addPart("part C");
}
public Product getProduct() {
return product;
}
}
public class ConcreteBuilder2 extends Builder{
private Product product = new Product();
@Override
public void buildPartA() {
product.addPart("part a");
}
@Override
public void buildPartB() {
product.addPart("part b");
}
@Override
public void buildPartC() {
product.addPart("part c");
}
public Product getProduct() {
return product;
}
}
// 指挥者 负责装配对象
public class Director {
public void construct(Builder builder){
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
}
}
举个例子,我们要实现一个文档转换器,负责将所有其他格式的文件转换成Word文档。
首先我们定义一个Word文档有哪些组件,比如标题、正文、页码、页眉页脚。
其次我们定义Word文档各个组成部位的抽象实现。
再次我们定义txt文件转换Word文档各个组成部位的具体实现。
最后我们定义一个文档转换器去装配这些组件。
这样我需要将txt转换为Word,只需要传递一个txt的builder;
后面如果我需要将xml转换为Word,也可以实现一个xml文件转换Word文档各个组成部位的具体实现。
应用
- Guava的内存缓存使用的就是建造者模式的变种。
- ClassBuilder是一个生成器,Class使用他为自己创建子类。在这个例子中,一个Class及时Director也是Product。
- ByteCodeStream是一个生成器,他将一个被编译了的方法创建为字节数组。
相关模式
Abstract Factory与Builder类似,因为他们都可以创建复杂对象。主要区别是Builder模式着重于一步步构造一个复杂对象。为Abstract Factory着重于多个系列的产品对象(简单的或者是复杂的)。Builder在最后一步返回产品,而Abstract Factory,产品立即返回。
组合模式通常用builder是生成
网友评论