一、对Builder模式解耦“过程”和“部件”的理解:
首先以组装汽车为例,一部汽车可以由发动机、方向盘、车轮等部件组成,而要把这些部件组装成一部完整的汽车则需要一个复杂的过程。相同的部件在不同的汽车工厂组装出来的就成为不一样的汽车。这就是Builder模式的最原始需求原型
从中我们可以看出,如果我们能够提供这样一种服务:客户只需要提供给我们必要的零件,并告知我们最终要组装成的汽车类型,由汽车装配公司负责整个后端的装配工作-对客户来说是完全透明的。那么我们将可以实现“部件”和“过程”的解耦。只要我们愿意,相同的部件在我们的手里就可以变成不同的产品
二、Builder模式的各个组成部分:
对Builder模式组成的理解,我们可以从两个不同的角度来看--客户和工厂
首先从客户的角度来看,客户能够看到、感受到的只有产品和部件,从工厂的角度来看,他们感兴趣的是如何生产这些零件以及如何把这些零件组装成一个合格的产品。
所以我们可以将Builder模式分成四个组成部分:
·产品:public interface Product
·零件:Public interface Part
·生产零件的过程:public interfact Builder
·组装零件的过程:public class Director
其中产品、零件都是一个接口,其下面可以有多个实现子类。我们重点关注的“生产零件的过程”和“组装零件的过程”
同样类型的产品其“生产零件的过程”不尽相同,所以我们必须将其定义成一个接口,由各个零件的生产厂家去实现具体的过程。如下所示:
public interface Builder {
//创建部件A 比如创建汽车车轮
void buildPartA();
//创建部件B 比如创建汽车方向盘
void buildPartB();
//创建部件C 比如创建汽车发动机
void buildPartC();
//返回最后组装成品结果 (返回最后装配好的汽车)
//成品的组装过程不在这里进行,而是转移到下面的Director类中进行.
//从而实现了解耦过程和部件
Product getResult();
}
public class ConcreteBuilder implements Builder {
Part partA, partB, partC;
public void buildPartA() {//这里是具体如何构建partA的代码};
public void buildPartB() {//这里是具体如何构建partB的代码};
public void buildPartC() {//这里是具体如何构建partB的代码};
public Product getResult() {
//返回最后组装成品结果
};
}
OK,既然已经厂家已经知道了如何生产零件了,那么剩下来的事情就是:1). 根据客户要求去生产这些零件 2). 组装零件成产品
组装成品由Director类负责,它负责和具体的Builder类交互,告诉Builder我要生产零件,将Builder类生产好的零件组装成成品,如下所示:
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();
.....
}
}
三、Builer模式的使用:
·创建一个Builer对象: Builder builer = new ConcreteBuiler();
·创建一个Director对象: Director director = new Director(builder);
·调用Director对象构建产品:director.construct();
·返回构建好的产品: Product product = builder.getResult();
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要尽力打好一手烂牌。
posted on 2008-01-02 23:01
Paul Lin 阅读(500)
评论(0) 编辑 收藏 所属分类:
模式与重构