C++的抽象工厂模式

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

C++的抽象工厂模式有如下优势:

1)正如起名字,抽象工厂模式隔离具体类的生产,使客户不需要知道什么被创建。

2)当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

3)增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。

而缺点是:

增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。

下面直接给一个C++实例来说明抽象工厂模式的实现

#include <string>
#include <map>
#include <list>
#include <stdio.h> 
#define USERS_PARAM(X) X;
class ZBSBase
{
public:
     ZBSBase(){}
     virtual bool InitParam(const std::string& strParam) = 0;
     virtual void Excute() = 0;
     virtual void End() = 0;
 };
 class ZBSMessage : public ZBSBase
  {
  public:
      ZBSMessage():m_bInit(false){}
  
      virtual bool InitParam(const std::string& strParam)
      {
          m_bInit = true;
          USERS_PARAM(strParam);
          return true;
      }
      virtual void Disp()
      {
          printf("ZBSMessage::Disp!\n");
      }
      virtual void End()
      {
          printf("ZBSMessage::End!\n");
      }
      virtual void Excute()
      {
          if (!m_bInit) return;
          printf("ZBSMessage::Excute!\n");
          Disp();
          End();
      }
  protected:
      bool m_bInit;
  };
  class ZBSEncodeMessage : public ZBSMessage
  {
  public:
      ZBSEncodeMessage(){}
      virtual void Disp()
      {
          printf("ZBSEncodeMessage::Disp\n");
      }
  };
  class ZBSJsonMessage : public ZBSMessage
  {
  public:
      ZBSJsonMessage(){}
      virtual void Disp()
      {
          printf("ZBSJsonMessage::Disp\n");
      }
  };
  class ZBSXMLMessage : public ZBSMessage
  {
  public:
      ZBSXMLMessage(){}
  
      virtual void Disp()
      {
          printf("ZBSXMLMessage::Disp\n");
      }
  };
  class ZBSCreatorBase
  {
  public:
      ZBSCreatorBase(){}
      virtual ZBSMessage* Create() = 0;
  };
  template<class T>
  class ZBSCreator :public ZBSCreatorBase
  {
  public:
      ZBSCreator(const std::string& strkey = "") :m_strKey(strkey){}
  
      ZBSMessage* Create()
      {
          return new T;
     }
 private:
     std::string m_strKey;
 };
 class ZBSFactoryMgr
 {
     ZBSFactoryMgr(){}
 public:
     static ZBSFactoryMgr& Instance()
     {
         static ZBSFactoryMgr s_Instance;
         return s_Instance;
     }
     void AddZBSCreator(const std::string& strClassName, ZBSCreatorBase* pZBSCreator)
     {
         if (m_mapZBSCreator.find(strClassName) == m_mapZBSCreator.end())
         {
             m_mapZBSCreator.insert(make_pair(strClassName, pZBSCreator));
         }
     }
 
     ZBSMessage* CreatorZBSInstace(const std::string& strKey)
     {
         ZBSMessage* pZBSObj = NULL;
         std::map<std::string, ZBSCreatorBase*>::iterator it;
 
         it = m_mapZBSCreator.find(strKey);
         if (it != m_mapZBSCreator.end())
         {
             pZBSObj = it->second->Create();
         }
 
         return pZBSObj;
     }
 
     int GetMapSize()
     {
         return m_mapZBSCreator.size();
     }
 
 private:
     std::map<std::string, ZBSCreatorBase*> m_mapZBSCreator;
 };
 
 #define REGISTER_ZBSFACTORY(ClassName)\
     ZBSFactoryMgr::Instance().AddZBSCreator(#ClassName, new ZBSCreator<ClassName>());
 extern "C" ZBSMessage* CreateZBSMessage(const std::string& strKey)
 {
     return ZBSFactoryMgr::Instance().CreatorZBSInstace(strKey);
 }
 
 int main()
 {
     REGISTER_ZBSFACTORY(ZBSXMLMessage);
     REGISTER_ZBSFACTORY(ZBSJsonMessage);
     REGISTER_ZBSFACTORY(ZBSEncodeMessage);
 
     ZBSMessage *pm1;
     ZBSMessage *pm2;
     ZBSMessage *pm3;
 
     std::list<ZBSMessage*> ls;
     std::list<ZBSMessage*>::iterator it;
 
     pm1 = CreateZBSMessage("ZBSXMLMessage");
     pm2 = CreateZBSMessage("ZBSJsonMessage");
     pm3 = CreateZBSMessage("ZBSEncodeMessage");
     ls.push_back(pm1);
     ls.push_back(pm2);
     ls.push_back(pm3);
 
     int nSize = ls.size();
     it = ls.begin();
     for (it; it != ls.end(); it++)
     {
         (*it)->InitParam("");
         (*it)->Excute();
     }
     return 0;
}

输出结果如下:

ZBSMessage::Excute!
ZBSXMLMessage::Disp
ZBSMessage::End!
ZBSMessage::Excute!
ZBSJsonMessage::Disp
ZBSMessage::End!
ZBSMessage::Excute!
ZBSEncodeMessage::Disp
ZBSMessage::End!

首先看下,首先声明了基类ZBSBase,之后继承ZBSBase类得到ZBSMessage类,下面定义了是那个用户用到的类,即需要“工厂生产”的类,分别用于处理Encode、Json和XML文件消息的类ZBSEncodeMessage、ZBSJsonMessage和ZBSXMLMessage。

接下来声明ZBSCreator类用来创建ZBSMessage类,ZBSFactoryMgr用来实现抽象工厂,我们来看抽象工厂的具体实现代码,首先看main函数的前3行代码:

REGISTER_ZBSFACTORY(ZBSXMLMessage);
REGISTER_ZBSFACTORY(ZBSJsonMessage);
REGISTER_ZBSFACTORY(ZBSEncodeMessage);

以REGISTER_ZBSFACTORY(ZBSXMLMessage)为例,其实际执行的代码为(注意C++中,符号#将传入的参数变为字符串,字符串化,而符号##为合并操作符,将出现在其左右的字符序列合并成一个新的标志符,注意是标志符不是字符串):

s_Instance.AddZBSCreator(“ZBSXMLMessage”, new ZBSCreator<ZBSXMLMessage>());

即m_mapZBSCreator中插入了3个对应消息类类型的ZBSCreator类实例,这里并创建消息类实例,接着执行:

pm1 = CreateZBSMessage("ZBSXMLMessage");
pm2 = CreateZBSMessage("ZBSJsonMessage");
pm3 = CreateZBSMessage("ZBSEncodeMessage");

此时会新建消息类的实例并返回指针,也就是通过宏定义REGISTER_ZBSFACTORY和CreateZBSMessage就可以一抽象工厂的方式创建一个具体消息类实例并返回了指针。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C++抽象工厂模式的伪代码示例: ```cpp // 抽象产品类 class AbstractProductA { public: virtual void operationA() = 0; }; // 具体产品类A1 class ProductA1 : public AbstractProductA { public: void operationA() override { // 具体操作 } }; // 具体产品类A2 class ProductA2 : public AbstractProductA { public: void operationA() override { // 具体操作 } }; // 抽象产品类 class AbstractProductB { public: virtual void operationB() = 0; }; // 具体产品类B1 class ProductB1 : public AbstractProductB { public: void operationB() override { // 具体操作 } }; // 具体产品类B2 class ProductB2 : public AbstractProductB { public: void operationB() override { // 具体操作 } }; // 抽象工厂类 class AbstractFactory { public: virtual AbstractProductA* createProductA() = 0; virtual AbstractProductB* createProductB() = 0; }; // 具体工厂类1 class ConcreteFactory1 : public AbstractFactory { public: AbstractProductA* createProductA() override { return new ProductA1(); } AbstractProductB* createProductB() override { return new ProductB1(); } }; // 具体工厂类2 class ConcreteFactory2 : public AbstractFactory { public: AbstractProductA* createProductA() override { return new ProductA2(); } AbstractProductB* createProductB() override { return new ProductB2(); } }; // 客户端代码 int main() { AbstractFactory* factory = new ConcreteFactory1(); AbstractProductA* productA = factory->createProductA(); AbstractProductB* productB = factory->createProductB(); productA->operationA(); productB->operationB(); delete productA; delete productB; delete factory; return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值