设计模式系列(11)抽象工厂模式

来源:互联网 发布:winebottler mac 下载 编辑:程序博客网 时间:2024/06/06 19:10
1.概念

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

备注:工厂模式要么生产香蕉、要么生产苹果、要么生产西红柿;但是不能生产一个产品组。抽象工厂能够生产一个产品组。

解释:

具体工厂在开闭原则下,能生产香蕉或者苹果或者梨子(产品等级结构)

抽象工厂在开闭原则下,能生产南方香蕉或南方苹果或南方梨子(产品族)
                                                   北方香蕉或苹果或梨子
重要区别:

工厂模式只能生产一个产品。(要么香蕉,要么苹果)

抽象工厂可以生产一个产品族(里面有很多产品组成)


2.模式中包含的角色及其职责
1).抽象工厂(Creator)角色:抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。
2).具体工厂(Concreter Creator)角色:具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品。
3).抽象(Product)角色:抽象模式所创建的所有对象的父类,它负责描述所有实例所有公共的接口。

4).具体产品(Concrete Product)角色:抽象模式所创建的具体实例对象。

                       

               抽象工厂UML类图

3.示例代码:

abstractfactory.h

#ifndef _ABSTRACTFACTORY_H_#define _ABSTRACTFACTORY_H_#include <iostream>using namespace std;class Fruit{public:    virtual void SayName() = 0;};class AbstractFactory{public:    virtual Fruit* CreateBanana() = 0;    virtual Fruit* CreateApple() = 0;};class NorthBanana : public Fruit{public:    virtual void SayName()    {        cout << "north banana" << endl;    }};class NorthApple : public Fruit{public:    virtual void SayName()    {        cout << "north apple" << endl;    }};class SourthBanana : public Fruit{public:    virtual void SayName()    {        cout << "Sourth banana" << endl;    }};class SourthApple : public Fruit{public:    virtual void SayName()    {        cout << "Sourth apple" << endl;    }};class NorthFactory : public AbstractFactory{public:    virtual Fruit* CreateBanana()    {        return new NorthBanana;    }    virtual Fruit* CreateApple()    {        return new NorthApple;    }};class SourthFactory : public AbstractFactory{public:    virtual Fruit* CreateBanana()    {        return new SourthBanana;    }    virtual Fruit* CreateApple()    {        return new SourthApple;    }};#endif /*_ABSTRACTFACTORY_H_*/


main.cpp

#include <iostream>#include "abstractfactory.h"using namespace std;int main(){    Fruit *fruit = NULL;    AbstractFactory *af = NULL;    af = new SourthFactory;    fruit = af->CreateApple();    fruit->SayName();    delete fruit;    fruit = af->CreateBanana();    fruit->SayName();    delete fruit;    af = new NorthFactory;    fruit = af->CreateApple();    fruit->SayName();    delete fruit;    fruit = af->CreateBanana();    fruit->SayName();    delete fruit;    delete af;    delete fruit;    return 0;}



阅读全文
0 0
原创粉丝点击