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

一,动机

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

引入两个概念:

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


缺点:

在新添加产品对象时,难以扩展抽象工厂来生成新产品。因为抽象工厂中已经规定了产品的接口。要支持新的产品,涉及到对工厂角色的修改

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值