一,动机
在工厂方法模式中,具体工厂负责产生具体的产品,每个具体工厂对应一种具体产品。但是有时候,一个工厂需要提供多个产品对象,而不是单一。对于学校,不仅能培养本科生,研究生,还能培养博士生。这个时候,工厂方式模式就显得不够用。
引入两个概念:
1,产品等级结构。即产品的继承结构。所有学校的 本科生,都是一个等级结构。
2,产品族。指同一工厂产生的一组产品。本科生,研究生等就是一个产品族。
二,定义
提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。
三,模式结构
1,Factory(抽象工厂)
规定子工厂的统一接口
2,ConcreteFactory(具体工厂)
实现各个子工厂的具体逻辑。
3,AbstractProduct(抽象产品)
工厂所创建的所有对象的父类
4,ConcreteProduct(具体产品)
子工厂创建的具体产品
四,代码实例
#include <iostream>
using namespace std;
class UnderGraduate
{
public:
virtual void Say()=0;
};
class PostGraduate
{
public:
virtual void Say()=0;
};
class School
{
public:
virtual UnderGraduate* produceUnderGraduate() = 0;
virtual PostGraduate* producePostGraduate() = 0;
};
class UnderGraduateA: public UnderGraduate
{
public:
void Say()
{
cout<<"我是AA本科生......很高兴得到聘用"<<endl ;
}
};
class PostGraduateA: public PostGraduate
{
public:
void Say()
{
cout<<"我是AA研究生......初次见面,多多关照"<<endl ;
}
};
class UnderGraduateB: public UnderGraduate
{
public:
void Say()
{
cout<<"我是BB本科生......很高兴得到聘用"<<endl ;
}
};
class PostGraduateB: public PostGraduate
{
public:
void Say()
{
cout<<"我是BB研究生......初次见面,多多关照"<<endl ;
}
};
class SchoolA : public School
{
UnderGraduate* produceUnderGraduate()
{
cout<<"这里是学校AA"<<endl;
cout<<"毕业了一个本科生"<<endl;
return new UnderGraduateA();
}
PostGraduate* producePostGraduate()
{
cout<<"这里是学校AA"<<endl;
cout<<"毕业了一个研究生"<<endl;
return new PostGraduateA();
}
};
class SchoolB : public School
{
UnderGraduate* produceUnderGraduate()
{
cout<<"这里是学校BB"<<endl;
cout<<"毕业了一个本科生"<<endl;
return new UnderGraduateB();
}
PostGraduate* producePostGraduate()
{
cout<<"这里是学校BB"<<endl;
cout<<"毕业了一个研究生"<<endl;
return new PostGraduateB();
}
};
int main()
{
School* Sl_test = new SchoolA();
Sl_test->producePostGraduate();
School* Sl_test2 = new SchoolB();
Sl_test2->produceUnderGraduate();
return 0;
}
输出:
这里是学校AA
毕业了一个研究生
这里是学校BB
毕业了一个本科生
缺点:
在新添加产品对象时,难以扩展抽象工厂来生成新产品。因为抽象工厂中已经规定了产品的接口。要支持新的产品,涉及到对工厂角色的修改