最近在学习设计模式相关的内容, 下面把看到的,和自己 理解的内容记录下来,
什么是工厂模式:
工厂模式类似于创建类的实例对象,所以当我们使用A a = new A();的时候,就可以考虑是不是可以用工厂来实现。
分别如下图所示
简单工厂模式
工厂方法模式
抽象工厂模式。
使用多边形来举个例子,
class polygon
{
polygon();
virtual ~polygon();
};
class triangle : public polygon
{
triangle();
virtual ~triangle();
};
class quadrange : public polygon
{
quadrange();
virtual ~quadrange();
}
当使用简单工厂模式时,
polygon* factory(int index)
{
switch(index)
{
case 3: return new triangle();break;
case 4: return new quadrange();break;
//....
}
}
当使用工厂模式时,
class creator
{
creator();
virtual ~creator();
void operator();
virtual polygen* factorymethod()=0;
};
class creator_triangle: public creator
{
creator_triangle();
virutal ~creator_triangle();
protected:
virtual polygen* factorymethod();
}
void creator::operator()
{
polygon *p = factorymethod();
}
polygon* creator_triangle::factorymethod()
{
return new triangle();
}
所以简单工厂模式是product进行建模, 而对creator没有建模,
工厂模式是对product和creator分别进行建模,由具体的creator来实现具体的product.
Abstract Factory模式和Factory最大的差别就是抽象工厂创建的是一系列相关的对象,其中创建的实现其实采用的就是Factory模式的方法,对于某个实现的有一个派生出来的抽象工厂,另一个实现有另一个派生出来的工厂,等等。
可以举一个简单的例子来解释这个模式:比如,同样是鸡腿(ProductA)和汉堡(ProductB),它们都可以有商店出售(AbstractFactory),但是有不同的实现,有肯德基(ConcreateFactory1)和麦当劳(ConcreateFactory2)两家生产出来的不同风味的鸡腿和汉堡(也就是ProductA和ProductB的不同实现)。
而负责生产汉堡和鸡腿的就是之前提过的Factory模式了。
抽象工厂需要特别注意的地方就是区分不同类型的产品和这些产品的不同实现。显而易见的,如果有n种产品同时有m中不同的实现,那么根据乘法原理可知有n*m个Factory模式的使用。