您的位置:首页 > 其它

设计模式-创建型03-抽象工厂

2013-12-31 16:15 399 查看
一,动机

在工厂方法模式中,具体工厂负责产生具体的产品,每个具体工厂对应一种具体产品。但是有时候,一个工厂需要提供多个产品对象,而不是单一。对于学校,不仅能培养本科生,研究生,还能培养博士生。这个时候,工厂方式模式就显得不够用。

引入两个概念:

1,产品等级结构。即产品的继承结构。所有学校的 本科生,都是一个等级结构。

2,产品族。指同一工厂产生的一组产品。本科生,研究生等就是一个产品族。



二,定义

提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。

三,模式结构





1,Factory(抽象工厂)

规定子工厂的统一接口

2,ConcreteFactory(具体工厂)

实现各个子工厂的具体逻辑。

3,AbstractProduct(抽象产品)

工厂所创建的所有对象的父类

4,[b]Concrete[b]Product(具体产品)[/b][/b]

子工厂创建的具体产品

四,代码实例

#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
毕业了一个本科生


缺点:

在新添加产品对象时,难以扩展抽象工厂来生成新产品。因为抽象工厂中已经规定了产品的接口。要支持新的产品,涉及到对工厂角色的修改
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: