抽象工厂模式

抽象工厂模式

概念

  抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。

产品及其等级结构

这里写图片描述

对于工厂模式:要么生产香蕉、要么生产苹果、要么生产西红柿;但是不能同时生产多个产品。

抽象工厂:能同时生产一个产品族(多个产品)。===》抽象工厂存在原因

重要区别:
工厂模式只能生产一个产品。(要么香蕉、要么苹果)
抽象工厂可以一下生产一个产品族(里面有很多产品组成)

角色及职责

  1. 抽象工厂(Creator)角色
    抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。

  2. 具体工厂( Concrete Creator)角色
    具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。只生产一个具体的产品实例。

  3. 抽象产品(Product)角色
    抽象工厂模式所创建的所有产品对象的父类,它负责描述所有实例所共有的公共接口。

  4. 具体产品(Concrete Product)角色
    抽象工厂模式所创建的具体实例对象,里面有具体产品的属性,均继承自抽象产品类,

这里写图片描述

这里写图片描述

案例

#include<iostream>
using namespace std;

/*抽象产品--作为抽象工厂的依赖*/
class Fruit
{
public:
    virtual void SayName()=0;
};


/*抽象工厂--里面有产品线(产品线是固定的,这是缺点)*/
class AbstractFactory
{
public:
    virtual Fruit* CreateBanana()=0;
    virtual Fruit* CreateApple()=0;
};


/*具体产品1--北方香蕉*/
class NorthBanana:public Fruit
{
     virtual void SayName()
    {
        cout<<"我是北方香蕉"<<endl;
    }
};

/*具体产品2--北方苹果*/
class NorthApple:public Fruit
{
     virtual void SayName()
    {
        cout<<"我是北方苹果"<<endl;
    }
};

/*具体产品3--南方香蕉*/
class SouthBanana:public Fruit
{
     virtual void SayName()
    {
        cout<<"我是南方香蕉"<<endl;
    }
};

/*具体产品3--南方苹果*/
class SouthApple:public Fruit
{
     virtual void SayName()
    {
        cout<<"我是南方苹果"<<endl;
    }
};


/*具体工厂1--北方工厂*/
class NorthFactory:public AbstractFactory
{
    virtual Fruit* CreateBanana()
    {
        return new NorthBanana;
    }

    virtual Fruit* CreateApple()
    {
        return new NorthApple;
    }
};

/*具体工厂2--南方工厂*/
class SouthFactory:public AbstractFactory
{
    virtual Fruit* CreateBanana()
    {
        return new SouthBanana;
    }

    virtual Fruit* CreateApple()
    {
        return new SouthApple;
    }
};


/*测试案例*/
int main261()
{
    Fruit * fruit = NULL;//抽象产品
    AbstractFactory *af = NULL;//抽象工厂

    af = new SouthFactory;//创建北方工厂

    fruit = af->CreateApple();//生产苹果
    fruit->SayName();
    delete fruit;//内存回收

    fruit = af->CreateBanana();//生产香蕉
    fruit->SayName();
    delete fruit;

    delete af;


    af = new NorthFactory;//创建南方工厂

    fruit = af->CreateApple();//生产苹果
    fruit->SayName();
    delete fruit;

    fruit = af->CreateBanana();//生产香蕉
    fruit->SayName();
    delete fruit;

    delete af;//内存回收

    return 0;
}

总结

  抽象工厂相比普通的工厂方法模式,在代码上表现为,抽象工厂里面的成员函数变多了,每一个成员函数在具体工厂被重写以后,又都能产生一种具体的产品,所以一个具体工厂便能够产生多个产品的实例。在生活中,便是生产复杂的产品线,比如有几个档次的产品,每个档次里面又有多种不同的产品!而普通工厂方法模式的抽象工厂一般只有一个成员函数,相应的,具体的工厂就只能生产一个单一的产品,适用于产品结构单一的情况!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值