xhliu 的个人资料青蛙王子的工作空间照片日志列表 工具 帮助

日志


12月20日

设计模式:5种创建模式举例

为了加强对这五种创建模式的理解,我就拿电脑生产做为例子。 一个电脑包含很多组件:CPU, Disk, Monitor, keyBoard, Mouse。
当然,首先我们有5种Factory: CPUFactory, DiskFactory, MonitorFactory, KeyBoardFactory, MouseFactory。这里采用的就是Factory模式,例如CPUFactory可以有Intel, AMD等等,DiskFactory可以有Maxto, Seaga等。这几个都是电脑组件的程产厂商,对于一个电脑的组成厂商,它需要声称这几个Factory的实例,以便于每次需要一个组建的时候就可以直接生成。于是一个全球的管理全部电脑组建的Abstract Factory就出现了。 人如其名,这个抽象工厂真的是抽象的,并没有这个组织。
 
class CPUFactory
{
public:
   virtual CPU* CreateCPU();
}
 
class IntelCPUFactory : public CPUFactory
{
public:
   virtual CPU* CreateCPU();
}
 
class AMDCPUFactory: public CPUFactory
{
public:
   virtual CPU* CreateCPU();
}
 
class MousePrototype
{
public:
   virtual Mouse* CreateMouse();
}
 
class SingletonAbstractComputerFactory
{
   virtual CPUFactory* CreateCPUFactory();
   virtual DiskFactory* CreateDiskFactory();
   ...
   virtual MousePrototype* CreateMouse();
}
 
显然,这个Abstract Factory只需要一个,因此它是singleton的。这样不管在世界的任何地方,我们制造一个 IntelCPUFactory,我都可以制造出来。
 
上面的Abstract里面CPU和Disk都是声称了一个Factory,例如可以生成IntelCPUFactory,生成MaxtoDiskFactory。而由于很多Mouse都是从一个原型里面做了一些修改,所以可以声明原型法。
 
有了上面的定义后,我们就可以在程序的任何地方,来得到一个CPU或者一个Disk,例如:我们在SingletonAbstractComputerFactory中只生产IntelCPU(这个可以写死在代码里面,也可以配置),如果需要生产其他新种类的CPU,只需要修改这个singleton类就可以了。
 
现在组建都有了,我们需要一台电脑,怎么办呢?我们可以让联想公司做这件事情,这就是builder
 
class Builder
{
public:
    virtual void SetCPU(CPU* cpu);
    virtual void SetDisk(Disk* disk);
    virtual void LinkToComputer();
}
 
class LegendBuilder : public builder
{
public:
    virtual void SetCPU(CPU* cpu);
    virtual void SetDisk(Disk* disk);
    virtual Computer* MakeComputer();
}
 
这里可以看出:builder和Abstract Factory的区别,可能他们的声明都是一样的,但是做的事情不一样。Abstract Factory侧重的是创建几个东西,而builder侧重的是把已经有的几个东西组成一个新的复杂的object。所以,intel是Factory,而联想是builder。
 

评论

请稍候...
很抱歉,您输入的评论太长。请缩短您的评论。
您没有输入任何内容,请重试。
很抱歉,我们当前无法添加您的评论。请稍后重试。
若要添加评论,需要您的家长授予您相应权限。请求权限
您的家长禁用了评论功能。
很抱歉,我们当前无法删除您的评论。请稍后重试。
您已超过了一天之内允许提供的评论数上限。请在 24 小时后重试。
因为我们的系统表明您可能在向其他用户提供垃圾评论,您的帐户已禁用了评论功能。如果您认为我们错误地禁用了您的帐户,请联系 Windows Live 支持部门
完成下面的安全检查,您提供评论的过程才能完成。
您在安全检查中键入的字符必须与图片或音频中的字符一致。

若要添加评论,请使用您的 Windows Live ID 登录(如果您使用过 Hotmail、Messenger 或 Xbox LIVE,您就拥有 Windows Live ID)。登录


还没有 Windows Live ID 吗?请注册

引用通告

此日志的引用通告 URL 是:
http://flyingfrog1980.spaces.live.com/blog/cns!515A924507F2FEA5!137.trak
引用此项的网络日志