一、 作用
本模式是用来产生一个或一类产品。这一类产品有一个共同的父类。
二、 模型图
三、 参与者
1、Creater:一个,对外提供操作接口。
2、ConcreteCreater:一个,负责具体产品的生成。
3、AbstractProduct:一个。一类抽象产品。
4、ConcreteProduct:多个,继承自AbstractProduct。
四、 操作流程
本模式有多种实现,最简单的是参数化工厂方法:即给接口传一个ProductID,接口就产生相关产品,这种方法能产生一类产品。
五、 比较
一、与抽象工厂模式
1、抽象工厂模式在使用时,要实例化一个具体的子工厂。工厂方法可以不要,可以直接生产。
2、抽象工厂模式一般要传一个工厂ID,选择实例化哪个工厂;而参数化工厂方法要传一个产品ID,选择要哪个具体产品。
3、抽象工厂模式用的是组合,而工厂方法模式用的是继承。
六、 C++实现
一个衬衣生产厂,可以生产女式和男式衬衣。
以下是C++代码实现:
#include <iostream>
using namespace std;
class AbstractShirt
{
public:
virtual void Show(void) = 0;
};
class WomanShirt: public AbstractShirt
{
public:
void Show(void)
{
cout<<"I am WomanShirt!"<<endl;
}
};
class ManShirt: public AbstractShirt
{
public:
void Show(void)
{
cout<<"I am ManShirt!"<<endl;
}
};
class ShirtFactory
{
public:
enum{WOMAN_SHIRT, MAN_SHIRT};
AbstractShirt *CreateShirt(int ShirtID);
void DestroyShirt(AbstractShirt *pShirt);
};
AbstractShirt *ShirtFactory::CreateShirt(int ShirtID)
{
AbstractShirt *pShirt = NULL;
switch (ShirtID)
{
case WOMAN_SHIRT:
pShirt = new WomanShirt;
break;
case MAN_SHIRT:
pShirt = new ManShirt;
break;
default:
break;
}
return pShirt;
}
void ShirtFactory::DestroyShirt(AbstractShirt *pShirt)
{
delete pShirt;
}
int main(int argc, char **argv)
{
ShirtFactory shirtFactory;
AbstractShirt *pShirt;
pShirt = shirtFactory.CreateShirt(ShirtFactory::WOMAN_SHIRT);
pShirt->Show();
shirtFactory.DestroyShirt(pShirt);
pShirt = shirtFactory.CreateShirt(ShirtFactory::MAN_SHIRT);
pShirt->Show();
shirtFactory.DestroyShirt(pShirt);
return 0;
}
另一例:采用模板的方式:
#include <iostream>
using namespace std;
class AbstractShirt
{
public:
virtual void Show(void) = 0;
};
class WomanShirt: public AbstractShirt
{
public:
void Show(void)
{
cout<<"I am WomanShirt!"<<endl;
}
};
class ManShirt: public AbstractShirt
{
public:
void Show(void)
{
cout<<"I am ManShirt!"<<endl;
}
};
template <class ProductT>
class FactoryOf
{
public:
ProductT *CreateProduct(void)
{
return new ProductT;
}
void DestroyProduct(ProductT *pProduct)
{
delete pProduct;
}
};
int main(int argc, char **argv)
{
FactoryOf<ManShirt> shirtFactory;
ManShirt *pShirt;
pShirt = shirtFactory.CreateProduct();
pShirt->Show();
shirtFactory.DestroyProduct(pShirt);
return 0;
}