1.现实问题
面向对象编程总是和现实问题的解决思想一致的。
汽车是如何产生的?这个问题在学习工厂模式中已经举过例子。我再重新分析一下,看看有何不同。
Factory模式中:
1.有一个抽象的工厂。
2.实现一个具体的工厂---汽车工厂。
3.工厂生产汽车A,得到汽车产品A。
4.工厂生产汽车B,得到汽车产品B。
这样做,实现了购买者和生产线的隔离。
Builder模式:
1.离合器工厂生产离合器产品,得到汽车部件A。
2.轮胎工厂生产轮子产品,得到汽车部件B。
3.车身工厂生产车身产品,得到汽车部件C。
4.将这些部件放到一起,形成刚好能够组装成一辆汽车的整体。
5.将这个整体送到汽车组装工厂,得到一个汽车产品。
或者更抽象一点理解:
1.将汽车的每一个零件都送到汽车组装工厂。
2.在工厂里,组装离合器,得到汽车部件A。
3.在工厂里,组装轮胎,得到汽车部件B。
4.在工厂里,组装车身,得到汽车部件C。
5.在工厂里,组装每个部件,得到一个汽车产品。
这样做,目的是为了实现复杂对象生产线和其部件的解耦。
二者不同在于:
Factory模式不考虑对象的组装过程,而直接生成一个我想要的对象。
Builder模式先一个个的创建对象的每一个部件,再统一组装成一个对象。
Factory模式所解决的问题是,工厂生产产品。而Builder模式所解决的问题是工厂控制产品生成器组装各个部件的过程,然后从产品生成器中得到产品。
2.开阔天空
我在学习的时候,把代码例子认真的读了一遍,便豁然开朗。
学习模式的目的在于了解此模式究竟为何模式。了解了此模式的结构已足矣。给我的感觉,模式就是一种思想。学习一个模式,花上一两个小时把此模式的意思理解了,就够了。其精华的所在会在以后工作的设计中逐渐体现出来。
首先,当一个产品(对象)的创建过程很复杂的时候,且这个产品的实现需要分别实现几个不同的部件。这个时候,我们考虑用到Builder模式。具体实现过程的例子如下:
Product: 复杂对象接口。我们最终就是为了得到它的一个对象。我叫它产品。
public interface Product {
public Product(Part partA, Part partB, Part partC);
}
Part: 复杂对象的部件接口。没准有几种。体现对象的复杂性。即产品部件。
public interface Part {
//
}
CarBuilder: 复杂对象的构建接口。Builder模式的重要体现之一--- 产品生成器。
public interface CarBuilder {
// 创建部件A
void buildPartA();
// 创建部件B
void buildPartB();
// 创建部件C
void buildPartC();
// 返回产品,不用的组装过程会返回不同的产品。
Product getResult();
}
MazidaBuilder: 具体的 产品生成器对象。
public class MazidaBuilder implements CarBuilder {
Part partA, partB, partC;
public void buildPartA() {
// 这里是具体如何构建partA的代码
partA = ;
};
public void buildPartB() {
// 这里是具体如何构建partB的代码
partB = ;
};
public void buildPartC() {
// 这里是具体如何构建partB的代码
partC = ;
};
public Product getResult() {
// 返回最后组装成品结果
return new Product(partA,partB,partC);
}
}
ConstructFactory: Builder模式的重要体现之二--- 产品组装工厂。
class ConstructFactory {
// 工厂里有一个产品生成器
private CarBuilder carBuilder;
public ConstructFactory(CarBuilder carBuilder) {
this.carBuilder = carBuilder;
}
// 在这里实现部件的组装及汽车的组装。
public void construct() {
// 组装部件A
carBuilder.buildPartA();
// 组装部件B
carBuilder.buildPartB();
// 组装部件C
carBuilder.buildPartC();
}// 到此,汽车组装完毕。
}
Temple:
public static void main(String args[]) {
// 建立产品生成器对象
MazidaBuilder ma6Builder = new MazidaBuilder();
// 建立产品组装工厂,由工厂操作产品生成器进行组装。
ConstructFactory cf = new ConstructFactory( ma6Builder );
// 开始组装。这里,改变工厂的组装过程,就可以组装成不同的产品。
cf.construct();
// 组装完毕
// 从产品生成器中得到产品
Product product = ma6Builder.getResult();
}
理解Builder模式,主要就是理解上面这几个过程。
Builder模式不是很常用。模式本身就是一种思想。知道了就可以了。