如题目
Polarislee(北极星)(北京那么大,何处是我家) 于 2004-10-20 11:01:06Builder模式属于创建型模式,它分装了一个复杂对象的创建过程。它与Factory模式的区别是,Factory模式可以一次性地创建需要的对象,而Builder需要不断地在客户和Builder之间进行交互,分步骤地创建一个完整的对象。
wildhorseych 于 2004-10-20 15:23:15我对builder的理解是,如果说abstract factory 是个配件工厂,那么builder就像个OEM厂商,它关心的是大的产品构造的过程。
abstract factory强调可从一个抽象的具有固定配件种类系列的基类派生出不同的具体工厂,这些不同的具体工厂拥有的配件种类都是一样的,只不过每种配件的牌子可能不相同。
builder强调可从一个具有固定生产流程的基类派生出不同的具体builder,这些不同的具体builder之间具有生产某个相同复杂产品的共同流程,但是每种流程的实现可能不一样。
请高手指点,另外,不是很明白,书上讲这个模式的时候,非要拉出来一个什么director,有什么必要??
Polarislee(北极星)(北京那么大,何处是我家) 于 2004-10-20 15:33:23这么说吧,你要创建一个具有复杂结构的对象,就好像要制造一辆汽车。
你(director)所知道的是怎样将一个一个的汽车零件组装在一起,而不知道怎样去制造这些零件。而builder是你的一家一家的零件供应商,它可以为你制造组装过程中所需的全部零件。这样,你在需要装一个轮子时,只需要调用builder->createWheel()就可以了
wildhorseych 于 2004-10-20 15:54:36可是builder一般都提供一个类似
Product* getProduct()成员函数阿
在builder.buildPart1();
builder.buildPart2();
...
之后就可以build.getProduct();
得到产品了阿
这样来说用户就可以自己调用这些东西获得自己想要的产品,为什么还需要director?
你说的意思是不是把对这些builder成员函数的调用封装在一个叫做director的类中间,也就是说吧算法封装起来。
用法是不是这样的。
Builder b;
Director d(b);
d.construct();
b.getProduct();
如果使用的方法如我所说那为什么不能用一个抽象工厂代替builder,而在Director中增加一个
getProduct()方法,这样也能达到隔离组装算法和配件生产的目的
请指教
Polarislee(北极星)(北京那么大,何处是我家) 于 2004-10-20 15:59:32你说的不是很明确,最好写点代码来表达你的意图。
另外,模式这种东西并不是僵化的,达到目标可能有很多种途径,我们这里只是其中一种,不过模式是被证明为比较好的途径,不过模写情况下不一定是最好的
wildhorseych 于 2004-10-20 16:47:03class Room{...};
class Door{...};
class Window{...};
class Wall{...};
class RoomBuilder
{
public:
RoomBuilder();
void buildWall();
void builDoor();
void builWindow();
void buildRoom();
Room* getRoom();
...
};
//client 端的一个用户想使用这个builder来造房子
Room* createRoom(const RoomBuilder& rb)
{
rb.buildWall();
rb.buildDoor();
rb.buildWindow();
rb.buildRoom();
return rb.getRoom();
}
在这个例子中,谁是director?你的意思是不是createRoom这个全局函数就可以看成是封装了算法的director?
Polarislee(北极星)(北京那么大,何处是我家) 于 2004-10-20 16:52:38差不多吧。