当一个对象很大时,可以考虑把这个对象的各个部分分开来构建,最后再得到你想要的对象。这就是Builder模式。这种模式可以将构建复杂对象的过程和它的部件解耦。
首先定义一个抽象类,规定好这个类的各个方面:
public interface Builder {
//创建部件A 比如创建汽车车轮
void buildPartA();
//创建部件B 比如创建汽车方向盘
void buildPartB();
//创建部件C 比如创建汽车发动机
void buildPartC();
//返回最后组装成品结果 (返回最后装配好的汽车)
//成品的组装过程不在这里进行,而是转移到下面的Director类中进行.
//从而实现了解耦过程和部件
Product getResult();
}
然后写一个Director类来定义方法的调用完成汽车的组装:
public class Director {
private Builder builder;
public Director( Builder builder ) {
this.builder = builder;
}
// 将部件partA partB partC最后组成复杂对象
//这里是将车轮 方向盘和发动机组装成汽车的过程
public void construct() {
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
}
}
最后写一个类来实现 制造这汽车各个部件的具体的方法(用不同的实现来 完成那几个创建部件方法,可以相像成不同的汽车厂商各按自己的标准和方式来制造具体自己特色的部件)
public class ConcreteBuilder implements Builder {
Part partA, partB, partC;
public void buildPartA() {
//这里是具体如何构建partA的代码
};
public void buildPartB() {
//这里是具体如何构建partB的代码
};
public void buildPartC() {
//这里是具体如何构建partB的代码
};
public Product getResult() {
//返回最后组装成品结果
};
}
到此所有需要的类都写完了,接下去就是怎么调用它们了。看个例子:
//先创建制造汽车部件的类
ConcreteBuilder builder = new ConcreteBuilder();
//再实现组装汽车的类
Director director = new Director( builder );
//构造这辆汽车
director.construct();
//得到这辆汽车
Product product = builder.getResult();