工厂模式

  引用维基百科的释义:工厂方法模式是一种实现了”工厂”概念的面向对象设计模式。就像其他创建型模式一样,它也是处理在不指定对象具体类型的情况下创建对象的问题。工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。

  我得理解是:所谓的工厂模式,即是一种产品(concrete(具体)类)由一种专门的工厂生产,即新增一个concreteProduct需要新增一个concreteFacrotyconcreteProduct的具体创建过程由concreteFactory负责,两者是一一对应的关系。

  这样就需要两个抽象基类,FactoryProductFactory,创建对象的工厂方法的基类,Product就是创建出来的对象的基类。

  还需要一个接口函数,Factory::FactoryMethod(),这是一个纯虚函数,具体在派生类中实现,创建对应的对象

  通俗来说,类似于游戏,兵营可以生产兵,且规则是这样的,因为要生产的兵种类不一,比如骑兵、步兵、弓手。但是骑兵只能在马场生产,步兵在步兵营生产,弓手在靶场生产。每种兵都在不同的特定兵营生产,这样特定的兵营就是concreteFactory,特定的兵种就是concreteProduct。对于每一种兵种来说,都有血量、攻击力等相同的属性,因此,这些可以放在一个Product类中,具体的兵种类型则由这个Product类派生而来。同理,在生产兵种的过程中,通常需要一个读条的过程等其他生产兵种需要的共同的东西,这些则可放入一个Factory类中,具体的兵营类型由这个Factory类派生。

  具体实现如下:

 

/*Product.h*/
#ifndef PRODUCT_H_INCLUDED
#define PRODUCT_H_INCLUDED

class Product
{
    public:
        virtual ~Product(){};
        Product(){};
};

class concreteProduct:public Product
{
    public:
        virtual ~concreteProduct(){std::cout<<"concreteProduct destructure...\n";}
        concreteProduct()
        {
            std::cout<<"concreteProduct constructure...\n";
        }
};

#endif // PRODUCT_H_INCLUDED



/*Factory.h*/
#ifndef FACTORY_H_INCLUDED
#define FACTORY_H_INCLUDED

class Factory
{
    public:
        virtual ~Factory(){std::cout<<"Factory destructure...\n";}
        Factory(){};
        void createOperation();
    protected:
        virtual Product* FactoryMethod() = 0;
};

class concreteFactory:public Factory
{
    public:
        ~concreteFactory(){std::cout<<"concreteFactory destructure...\n";}
        concreteFactory()
        {
            std::cout<<"concreteFactory constructure...\n";
        }
    private:
        Product* FactoryMethod();
};

void Factory::createOperation()
{
    Product *p = FactoryMethod();
}

Product* concreteFactory::FactoryMethod()
{
    return new concreteProduct;
}
#endif // FACTORY_H_INCLUDED

/*测试函数*/
#include<iostream>
#include"Product.h"
#include"Factory.h"

using namespace std;

int main()
{
    Factory *p = new concreteFactory();
    p->createOperation();
    delete p;
    return 0;
}

 

 

 

posted @ 2012-08-29 20:10  山野樵夫  阅读(169)  评论(0编辑  收藏  举报