设计模式: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。