c++设计模式(22)-Abstract Factory模式

来源:互联网 发布:枪械百科软件 编辑:程序博客网 时间:2024/06/01 19:51

一、功能

 

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

  二、结构图

  类厂最基本的结构示意图如下:

  在实际应用中,类厂模式可以扩充到很复杂的情况,如下图所示:

  三、优缺点

  优点:(1)封装创建过程。客户不用知道类厂是如何创建类实例的,类厂封闭了所有创建的细节。这样可选择不同的创建方法,增加了灵活性。 (2)将客户与具体类隔离,提高了各自的可重用性。
  缺点:Factory类层次与具体类层次通常是平行的(即一一对应的)。增加一个具体类,一般也要相应地增加一个factory类,增加了系统复杂度。

  四、实现

  (1)通常可以把工厂作为单件。

抽象工厂(Abstract Factory)模式看起来和前面看到的工厂方法很相似,只是它使用若干工厂方法(Factory Method)模式。每个工厂方法模式创建一个不同类型的对象。当创建一个工厂对象时,要决定将如何使用由那个工厂创建的所有对象。示例代码如下(假设要创建一个通用的游戏环境,并且希望它能支持不同类型的游戏):
#include<iostream>
using namespace std;

class Obstacle
{
public:
        virtual void action()=0;
};

class Player
{
public:
        virtual void interactWith(Obstacle*)=0;
};

class Kitty: public Player
{
        virtual void interactWith(Obstacle *ob)
        {
                cout<<"Kitty has encountered a";
                ob->action();
        }
};

class KungFuGuy: public Player
{
        virtual void interactWith(Obstacle* ob)
        {
                cout<<"KungFuGuy now battles against a";
                ob->action();
        }
};
class Puzzle: public Obstacle
{
public:
        void action(){cout<<"Puzzle"<<endl;}
};

class NastyWeapon: public Obstacle
{
public:
        void action(){cout<<"NastyWeapon"<<endl;}
};

//the abstract factory
class GameElementFactory
{
public:
        virtual Player* makePlayer()=0;
        virtual Obstacle* makeObstacle()=0;
};

//concreate factories
class KittiesAndPuzzles:public GameElementFactory
{
public:
        virtual Player* makePlayer(){return new Kitty;}
        virtual Obstacle * makeObstacle(){return new Puzzle;}
};

class KillAndDismember:public GameElementFactory
{
public:
        virtual Player* makePlayer(){return new KungFuGuy;}
        virtual Obstacle *makeObstacle(){return new NastyWeapon;}
};


class GameEnvironment
{
        GameElementFactory* gef;
        Player* p;
        Obstacle *ob;
public:
        GameEnvironment(GameElementFactory * factory):gef(factory),p(factory->makePlayer()),ob(factory->makeObstacle())

        {

        }
        void play()

        {

                p->interactWith(ob);

         }
        ~GameEnvironment()
        {
                delete p;
                delete ob;
                delete gef;
        }
};

int main()
{
    GameEnvironment;
        g1(new KittiesAndPuzzles);

        g2(new KillAndDismember);
    g1.play();
    g2.play();
}

        在此环境中,Player对象与Obstacle 对象交互,但是Player和Obstacle类型依赖于具体的游戏。可以选择特定的GameElementFactory来决定游戏的类型,然后GameEnvironment控制游戏的设置和进行。在本例中,游戏的设置和进行很简单,但是那些动作在很大程度上决定了游戏的结果。
 

原创粉丝点击