工厂方法模式:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。“创建与使用相分离”。
优点:
1.用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;
2.在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;
缺点:
每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,增加了系统的复杂度。
主要角色:
具体示例:
手机厂生产手机,电视厂生产电视
第一步:抽象产品
//抽象产品
class Product
{
public:
virtual void show()=0;
};
第二步:具体产品
//具体产品1
class ConProduct1:public Product
{
public:
void show()
{
cout<<"手机产品生产完成"<<endl;
}
};
//具体产品2
class ConProduct2:public Product
{
public:
void show()
{
cout<<"电视产品生产完成"<<endl;
}
};
第三步:抽象工厂
//抽象工厂类
class Factory
{
public:
//此处只能返回一个抽象类的指针,抽象类不能返回实体
virtual Product* newProduct()=0;
};
第四步:具体工厂
//具体工厂1,实现产品1的生产
class ConFactory1:public Factory
{
public:
Product* newProduct()
{
cout<<"手机厂生产手机"<<endl;
return new ConProduct1();
}
};
//具体工厂2,实现产品2
class ConFactory2:public Factory
{
public:
Product* newProduct()
{
cout<<"电视厂生产电视"<<endl;
return new ConProduct2();
}
};
第五步:主函数
#include "p.h"
int main()
{
Product *P1=new ConProduct1();
Product *P2=new ConProduct2();
Factory *PF1=new ConFactory1();
Factory *PF2=new ConFactory2();
P1=PF1->newProduct();
P1->show();
P2=PF2->newProduct();
P2->show();
return 0;
}
结果显示: