空中社区

首页 » 〓〓娱乐地带〓〓 » ┫数码风云┣ » 编程与项目开发 » C++设计模式--简单工厂模式
计算机紧急响应组 - 2008-6-12 10:35:00
根据类名建立类。

这就类似一个工厂,工厂根据产品名来生产产品。

伪代码
switch(产品名)
{
case 'A' :  生产A;break;
case 'B' : 生产B;break;
}

下面是一个简单工厂模式的图



在C++里,我们利用多态,通过建立一个产品的抽象类,然后其他产品都从这个抽象类继承,这样我们就可以用代码写出一个“简单工厂模式”程序了,具体代码如下

#include <iostream>
using namespace std;
class CProduct//产品的抽象接口
{
public:
virtual void info() = 0;
};
class CProductA : public CProduct //实际产品A
{
public:
void info()
{
  cout << "this is CProductA" << endl;
}
};
class CProductB : public CProduct //实际产品B
{
public:
void info()
{
  cout << "this is CProductB" << endl;
}
};
class CFactory//工厂
{
public:
CProduct* produce(char cName)//根据产品名生产产品
{
  switch(cName)
  {
  case 'A':
  return new CProductA();
  break;
  case 'B':
  return new CProductB();
      break;
  default:
      break;
  }
}
};
int main()
{
CFactory factory;
CProduct *product = factory.produce('A');
product->info();
return 0;
}
计算机紧急响应组 - 2008-6-12 10:36:00
这个模式最大的缺陷在于CFactory::produce(char cName)函数,在这里我们只有CProductA和CProductB两种产品,所以这个函数里的switch语句不算臃肿,但如果我有N项产品,我们的switch语句就完蛋了。

下面我们用STL中的map来解决这个问题。
计算机紧急响应组 - 2008-6-12 10:36:00
#include <iostream>
#include <map>
#include <string>
using namespace std;

class CProduct//产品的抽象接口
{
public:
    virtual void info(){}
    virtual CProduct* newProduct()
    {
        return new CProduct();
    }
};

class CProductA : public CProduct //实际产品A
{
public:
    CProductA(){}
    void info()
    {
        cout << "this is CProductA" << endl;
    }
    CProduct* newProduct()
    {
        return new CProductA();
    }
};

class CProductB : public CProduct //实际产品B
{
public:
    CProductB(){}
    void info()
    {
        cout << "this is CProductB" << endl;
    }
    CProduct* newProduct()
    {
        return new CProductB();
    }
};
class CFactory//工厂
{
public:
    void registerProdect(const string& strProductName, CProduct *pObject)//注册产品
    {
        m_productMap[strProductName] = pObject;
    }
    CProduct *produce(const string& strProductName)//生产产品
    {
        map<string, CProduct*>::iterator ptr = m_productMap.find(strProductName);
        if (ptr == m_productMap.end())
        {
            return NULL;
        }
        else return (*ptr).second->newProduct();
    }
private:
    map<string, CProduct*> m_productMap;//存放产品名和其对应的产品对象
};

int main()
{
    CFactory factory;
    factory.registerProdect("CProductA", new CProductA());
    factory.registerProdect("CProductB", new CProductB);

    CProduct *product = factory.produce("CProductA");
    product->info();

    product = factory.produce("d");
    if (NULL != product)
    {
        product->info();
    }
    return 0;
}
计算机紧急响应组 - 2008-6-12 10:36:00
工厂模式一共有三种:简单工厂模式,工厂方法,抽象工厂

在这里先介绍这个“简单工厂模式”。。随后再介绍工厂方法和抽象工厂
1
查看完整版本: C++设计模式--简单工厂模式