工厂方法模式:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。“创建与使用相分离”。
优点:
1.用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;
2.在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;
缺点:
每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,增加了系统的复杂度。
主要角色:
- 抽象工厂:提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
- 具体工厂:主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
- 抽象产品:定义了产品的规范,描述了产品的主要特性和功能。
- 具体产品:实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应.
具体示例:
手机厂生产手机,电视厂生产电视
第一步:抽象产品
代码语言:javascript复制//抽象产品
class Product
{
public:
virtual void show()=0;
};
第二步:具体产品
代码语言:javascript复制//具体产品1
class ConProduct1:public Product
{
public:
void show()
{
cout<<"手机产品生产完成"<<endl;
}
};
//具体产品2
class ConProduct2:public Product
{
public:
void show()
{
cout<<"电视产品生产完成"<<endl;
}
};
第三步:抽象工厂
代码语言:javascript复制//抽象工厂类
class Factory
{
public:
//此处只能返回一个抽象类的指针,抽象类不能返回实体
virtual Product* newProduct()=0;
};
第四步:具体工厂
代码语言:javascript复制//具体工厂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();
}
};
第五步:主函数
代码语言:javascript复制#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;
}
结果显示: