抽象工厂模式

来源:互联网 发布:神机妙算软件打不开 编辑:程序博客网 时间:2024/05/10 18:12

抽象工厂模式

  • 抽象工厂模式
    • 概念
    • 产品及其等级结构
    • 角色及职责
    • 案例
    • 总结

概念

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

产品及其等级结构

这里写图片描述

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

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

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

角色及职责

  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
原创粉丝点击