Abstract Factory + Template = Builder
所以我写出了在某种程度上觉得成立的一个公式,不知大家有何高见?
builder模式的核心就是Director类,实际上有一个Director类,它就是builder模式,呵呵
public interface Builder {
//创建部件A 比如创建汽车车轮
void buildPartA();
//创建部件B 比如创建汽车方向盘
void buildPartB();
//创建部件C 比如创建汽车发动机
void buildPartC();
//返回最后组装成品结果(返回最后装配好的汽车)
//成品的组装过程不在这里进行,而是转移到下面的Director 类中
进行.
//从而实现了解耦过程和部件
Product getResult();
}
public class Director {
private Builder builder;
public Director( Builder builder ) {
this.builder = builder;
}
public void construct() {
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
}
}
=============================
如果我们把Banq的以上代码整合成这样:
public abstract class Builder {
public abstract void buildPartA(){};
public abstract void buildPartB(){};
public abstract void buildPartC(){};
public void construct(){
this.buildPartA();
this.buildPartB();
this.buildPartC();
}
public abstract Product getResult(){};
}
public class ConcretBuilder extends Builder{
private Product product;
public void buildPartA(){这里是具体如何构建partA 的代码};
public void buildPartB(){这里是具体如何构建partB 的代码};
public void buildPartC(){这里是具体如何构建partC 的代码};
public Product getResult(){返回最后组装成品结果}
}
ConcreteBuilder concretebuilder = new ConcreteBuilder();
concretebuilder.construct();
Product product = concretebuilder.getResult();
The difference is that
In Builder class, there is some common thing: construct(), 这个construct()的东东也可能看做Template模式中的核心.
请多发表意见,多谢!
其实我们可以通过模式的变形来去更深刻的认识模式,尤其是易混淆的模式,这样才能真正为我们所用。希望以后多交流。
builder模式就是builder模式,去掉Director类,它就不是builder模式
builder模式是强调产品是分步得到的
template模式强调的是继承的方法有点象模板,就象servlet的service()方法
Abstract Factory模式强调的是抽象的产品簇的问题
我觉的,非要把它们扯到一起来,并没有什么实际意义,呵呵!
大家的板砖准备好,^_^
其实也不是要把各种模式扯到一起来,只是想通过这种方式消化一下罢了。模不模式并不是目的,只是手段,对于我们来说,关键是这种模式在什么背景下产生,通过什么方式达到了什么目的,它的优且点的什么。
这样在我们做设计时才能为我所用,而不是硬生生的用某种模式来复杂化不必要的代码。
板砖这里不好找,我只是刚把脚上的鞋脱了,哈,开个玩笑。
Template至少有两个类,加在一起,至少是有十个类,人可以控制的混乱度是7左右,所以我觉得我是不愿意把它们联合使用
至于 Abstract Factory + Template = Builder,也是builder模式可以退化成Template ,和有没有Abstract Factory 并没有多大关系。
继续讨论,谢谢!
public final ConcreteBuilder {
public void buildPart1() {...}
public void buildPart2() {...}
}
我觉得Director角色实在可以省略不要,完全没有必要。