您的位置:首页 > 其它

工厂模式

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

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

  这样就需要两个抽象基类,Factory和Product。Factory,创建对象的工厂方法的基类,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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: