博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
05.抽象工厂模式+反射--AbstractFactory&Reflect
阅读量:2392 次
发布时间:2019-05-10

本文共 4305 字,大约阅读时间需要 14 分钟。

抽象工厂模式(AbstractFactory)和反射技术(Reflect)都在前面的笔记中记录了,现在将两个功能结合起来。还是以快餐店的食品为例子。

首先,有快餐店的食品作为产品的基类,然后有鸡腿和汉堡两类食品,而鸡腿和汉堡又分肯德基的和麦当劳的。肯德基和麦当劳的汉堡和鸡腿是不同的,也就是说是不同的实现类型,合乎抽象工厂的使用场合。

下面看具体的实现代码:

// ReflectFactory.h#pragma once#include 
typedef void* (*lpCreateInstanceFun)();typedef struct tagClassInfoData{ std::string strClassName; lpCreateInstanceFun pFun; tagClassInfoData* pNext;}ClassInfoData;class CReflectFactory{private: static ClassInfoData* pData; static ClassInfoData* pHead; static CReflectFactory _tmp_;public: CReflectFactory(void); ~CReflectFactory(void); static void AddInstance(const std::string& strClassName, lpCreateInstanceFun pFun); static void* GetInstance(const std::string& strClassName);};#define DECLARE_REFLECT(CLASS_NAME) private:\ static void* _CreateInstance_(){ return new CLASS_NAME(); }\ static wchar_t _m_AddFunc_;\ static wchar_t _AddFunc_() { CReflectFactory::AddInstance(#CLASS_NAME, &_CreateInstance_); return 0; }#define IMPLEMENT_REFLECT(CLASS_NAME) wchar_t CLASS_NAME::_m_AddFunc_ = _AddFunc_();// ReflectFactory.cpp#include ".\ReflectFactory.h"ClassInfoData* CReflectFactory::pData = NULL;ClassInfoData* CReflectFactory::pHead = NULL;CReflectFactory CReflectFactory::_tmp_;CReflectFactory::CReflectFactory(void){}CReflectFactory::~CReflectFactory(void){ ClassInfoData* pFind = pHead; while ( pFind != NULL ) { pFind = pHead->pNext; delete pHead; pHead = pFind; }}void CReflectFactory::AddInstance(const std::string& strClassName, lpCreateInstanceFun pFun){ if ( NULL != pFun ) { if ( NULL == pData ) { pData = new ClassInfoData(); pHead = pData; } else { pData->pNext = new ClassInfoData(); pData = pData->pNext; } pData->strClassName = strClassName; pData->pFun = pFun; pData->pNext = NULL; }}void* CReflectFactory::GetInstance(const std::string& strClassName){ std::string str = strClassName; ClassInfoData* pFind = pHead; while ( pFind != NULL ) { if ( str == pFind->strClassName ) { return pFind->pFun(); // 这个括号别再忘了 } pFind = pFind->pNext; } return NULL;}//Product.h#ifndef _PRODUCT_H_#define _PRODUCT_H_#include
#include "ReflectFactory.h"// 快餐店的食品class AbstractProduct{ DECLARE_REFLECT(AbstractProduct);public: virtual ~AbstractProduct();protected: AbstractProduct();private:};// 鸡腿class AbstractProductA : public AbstractProduct{ DECLARE_REFLECT(AbstractProductA);public: virtual ~AbstractProductA();protected: AbstractProductA();private:};// 汉堡class AbstractProductB : public AbstractProduct{ DECLARE_REFLECT(AbstractProductB);public: virtual ~AbstractProductB();protected: AbstractProductB(); private:};// 肯德基的鸡腿class ProductA1:public AbstractProductA{ DECLARE_REFLECT(ProductA1);public: ProductA1(); ~ProductA1();protected: private:};// 麦当劳的鸡腿class ProductA2:public AbstractProductA{ DECLARE_REFLECT(ProductA2);public: ProductA2(); ~ProductA2();protected: private:};// 肯德基的汉堡class ProductB1:public AbstractProductB{ DECLARE_REFLECT(ProductB1);public: ProductB1(); ~ProductB1();protected:private:};// 麦当劳的汉堡class ProductB2:public AbstractProductB{ DECLARE_REFLECT(ProductB2);public: ProductB2(); ~ProductB2();protected: private:};#endif //~_PRODUCT_H_ECT_H_//Product.cpp#include "Product.h"#include
using namespace std;IMPLEMENT_REFLECT(AbstractProduct);AbstractProduct::AbstractProduct(){ cout<<"AbstractProduct...快餐店的食品"<
(CReflectFactory::GetInstance("AbstractProduct")); AbstractProduct* pA = static_cast
(CReflectFactory::GetInstance("AbstractProductA")); AbstractProduct* pB = static_cast
(CReflectFactory::GetInstance("AbstractProductB")); AbstractProduct* pA1 = static_cast
(CReflectFactory::GetInstance("ProductA1")); AbstractProduct* pA2 = static_cast
(CReflectFactory::GetInstance("ProductA2")); AbstractProduct* pB1 = static_cast
(CReflectFactory::GetInstance("ProductB1")); AbstractProduct* pB2 = static_cast
(CReflectFactory::GetInstance("ProductB2")); return 0;}
从main函数中的客户端代码就可以看出反射的威力所在了。客户不需要知道除产品名称外的任何信息,也不需要知道具体创建产品的工厂信息,并且在工厂内部代码中,也避免了Factory模式中的对于不同的产品需要用选择或分支语句去实现具体的产品代码,更好的满足了OCP(见《02.工厂模式--Factory》)。

转载地址:http://ojhab.baihongyu.com/

你可能感兴趣的文章
how to use this bugs unserialize()
查看>>
Grep与web漏洞挖掘
查看>>
正则表达式使用详解
查看>>
引用函数magic_quotes_gpc和magic_quotes_runtime的区别和用法(新手推荐)
查看>>
编写不受魔术引号影响的php应用
查看>>
PHP开发安全设置
查看>>
Php Endangers - Remote Code Execution
查看>>
变量的变量,PHP和你
查看>>
PROC系列之四---/proc/loadavg
查看>>
某大型网站的内核TCP/ip优化脚本
查看>>
Defeating SSL using SSLStrip (Marlinspike Blackhat)
查看>>
大型网站数据库架构
查看>>
rdp 安全策略
查看>>
Threat Intelligence Quotient Test
查看>>
Cisco路由器上防止DDOS的一些建议
查看>>
系统安全防护之UNIX下入侵检测方法
查看>>
域控渗透技巧
查看>>
Minion security project and 分布式nmap
查看>>
防火墙相关
查看>>
网络性能测试工具Iperf上手指南
查看>>