设计模式 : 带2个参数的简单工厂
发布日期:2021-06-30 22:16:56
浏览次数:2
分类:技术文章
本文共 10054 字,大约阅读时间需要 33 分钟。
前言
工程里有一段数据的处理代码,要分许多case进行处理,想整个简单工厂来处理。
书上的例子,都是1个参数的。简单工厂有2个入参,该咋弄好些? 想来想去,就一个工厂类了,不继续在工厂类的内部再弄工厂类了。参数1引起的switch-case在工厂类的接口里面直接处理,参数2引起的switch-case, 放在工厂类的成员函数里面处理。 new出来的是数据处理类指针,在程序活着的时候,一种case只需要一个数据处理类. 将new出来的数据处理类指针,根据2个入参合并成一个map-key, 将指针压入map. 当调用者再请求数据类指针时,先合成map-key, 去map中去找,如果有就返回已有的数据处理类指针。如果没找到指定map-key的数据处理类指针,再去new数据处理类。 在程序退出时,调用工厂类的destory方法,进行资源释放。工程下载点
工程预览
// @file \testcase\test_data_factory\data_factory.cpp#include#include #include #include #include "MY_data_process_factory.h"void test_data_factory();int main(int argc, char** argv){ test_data_factory(); // when prog end, free resource MY_data_process_factory::detory(); printf("END\n"); _getch(); return 0;}void test_data_factory(){ int i = 0; unsigned int ui_rc = MY_DATA_PROCESS_ERR; MY_data_process_base* process_er = NULL; do { process_er = MY_data_process_factory::create_processer(DATA_TYPE_A, DATA_DIRECTION_RIGHT); if (NULL != process_er) { ui_rc = process_er->process((const unsigned char*)"hello world", (int)strlen("hello world")); } printf("* data process %s\n", (ui_rc == MY_DATA_PROCESS_OK) ? "ok" : "error"); } while (++i < 3); process_er = MY_data_process_factory::create_processer(DATA_TYPE_B, DATA_DIRECTION_DOWN); if (NULL != process_er) { ui_rc = process_er->process((const unsigned char*)"hello world", (int)strlen("hello world")); } printf("** data process %s\n", (ui_rc == MY_DATA_PROCESS_OK) ? "ok" : "error");}
// @file : \test_data_factory\MY_data_process_factory.h// @brief : ...#ifndef ___TEST_DATA_FACTORY_MY_DATA_PROCESS_FACTORY_H__#define ___TEST_DATA_FACTORY_MY_DATA_PROCESS_FACTORY_H__#include
// @file \testcase\test_data_factory\MY_data_process_factory.cpp#include#include #include #include #include "MY_data_process_factory.h"#include "MY_data_process_TYPE_A_DIR_UP.h"#include "MY_data_process_TYPE_A_DIR_DOWN.h"#include "MY_data_process_TYPE_A_DIR_LEFT.h"#include "MY_data_process_TYPE_A_DIR_RIGHT.h"#include "MY_data_process_TYPE_B_DIR_UP.h"#include "MY_data_process_TYPE_B_DIR_DOWN.h"#include "MY_data_process_TYPE_B_DIR_LEFT.h"#include "MY_data_process_TYPE_B_DIR_RIGHT.h"MY_data_process_factory* MY_data_process_factory::m_this = NULL;MY_data_process_factory::MY_data_process_factory(void){}MY_data_process_factory::~MY_data_process_factory(void){ std::map ::iterator it; MY_data_process_base* p_processer = NULL; for (it = m_map_processer.begin(); it != m_map_processer.end(); it++) { p_processer = it->second; if (NULL != p_processer) { delete [] p_processer; p_processer = NULL; } } m_map_processer.clear();}MY_data_process_factory* MY_data_process_factory::get_instance(){ if (NULL == MY_data_process_factory::m_this) { MY_data_process_factory::m_this = new MY_data_process_factory(); } return MY_data_process_factory::m_this;}void MY_data_process_factory::detory(){ if (NULL != MY_data_process_factory::m_this) { delete MY_data_process_factory::m_this; MY_data_process_factory::m_this = NULL; }}bool MY_data_process_factory::is_valid_type_and_dir(DATA_TYPE data_type, DATA_DIRECTION data_dir){ bool b_rc = false; do { if ((DATA_TYPE_UNKNOWN == data_type) || (DATA_DIRECTION_UNKNOWN == data_dir)) { break; } b_rc = true; } while (0); return b_rc;}uint16_t MY_data_process_factory::calc_map_key(DATA_TYPE data_type, DATA_DIRECTION data_dir){ uint16_t w_rc = 0; w_rc = data_type; w_rc <<= 8; w_rc &= 0xff00; w_rc |= data_dir; return w_rc;}MY_data_process_base* MY_data_process_factory::create_processer(DATA_TYPE data_type, DATA_DIRECTION data_dir){ uint16_t map_key = 0; MY_data_process_factory* p_factory = NULL; MY_data_process_base* process_er = NULL; std::map ::iterator it; do { p_factory = get_instance(); if (NULL == p_factory) { break; } if (!p_factory->is_valid_type_and_dir(data_type, data_dir)) { break; } map_key = p_factory->calc_map_key(data_type, data_dir); it = p_factory->m_map_processer.find(map_key); if (it != p_factory->m_map_processer.end()) { process_er = it->second; } else { switch (data_type) { case DATA_TYPE_A: process_er = p_factory->create_processer_by_DataTypeA(data_dir); break; case DATA_TYPE_B: process_er = p_factory->create_processer_by_DataTypeB(data_dir); break; default: break; } if (NULL != process_er) { p_factory->m_map_processer.insert(std::make_pair(map_key, process_er)); } } } while (0); return process_er;}MY_data_process_base* MY_data_process_factory::create_processer_by_DataTypeA(DATA_DIRECTION data_dir){ MY_data_process_base* process_er = NULL; switch (data_dir) { case DATA_DIRECTION_UP: process_er = new MY_data_process_TYPE_A_DIR_UP(); break; case DATA_DIRECTION_DOWN: process_er = new MY_data_process_TYPE_A_DIR_DOWN(); break; case DATA_DIRECTION_LEFT: process_er = new MY_data_process_TYPE_A_DIR_LEFT(); break; case DATA_DIRECTION_RIGHT: process_er = new MY_data_process_TYPE_A_DIR_RIGHT(); break; default: break; } return process_er;}MY_data_process_base* MY_data_process_factory::create_processer_by_DataTypeB(DATA_DIRECTION data_dir){ MY_data_process_base* process_er = NULL; switch (data_dir) { case DATA_DIRECTION_UP: process_er = new MY_data_process_TYPE_B_DIR_UP(); break; case DATA_DIRECTION_DOWN: process_er = new MY_data_process_TYPE_B_DIR_DOWN(); break; case DATA_DIRECTION_LEFT: process_er = new MY_data_process_TYPE_B_DIR_LEFT(); break; case DATA_DIRECTION_RIGHT: process_er = new MY_data_process_TYPE_B_DIR_RIGHT(); break; default: break; } return process_er;}
// @file : \test_data_factory\MY_data_process_base.h// @brief : ...#ifndef ___TEST_DATA_FACTORY_MY_DATA_PROCESS_BASE_H__#define ___TEST_DATA_FACTORY_MY_DATA_PROCESS_BASE_H__#define MY_DATA_PROCESS_OK 0#define MY_DATA_PROCESS_ERR (unsigned int)(-1)class MY_data_process_base{public: MY_data_process_base(void); virtual ~MY_data_process_base(void); // 处理数据,返回错误码 // 返回 MY_DATA_PROCESS_OK = 成功,其他值失败 virtual unsigned int process(const unsigned char* puc_data, int i_data_len) = 0;};#endif // #define ___TEST_DATA_FACTORY_MY_DATA_PROCESS_BASE_H__
// @file \testcase\test_data_factory\MY_data_process_base.cpp#include "MY_data_process_base.h"MY_data_process_base::MY_data_process_base(void){}MY_data_process_base::~MY_data_process_base(void){}
// @file : \testcase\test_data_factory\MY_data_process_TYPE_A_DIR_RIGHT.h// @brief : ...#ifndef ___TESTCASE_TEST_DATA_FACTORY_MY_DATA_PROCESS_TYPE_A_DIR_RIGHT_H__#define ___TESTCASE_TEST_DATA_FACTORY_MY_DATA_PROCESS_TYPE_A_DIR_RIGHT_H__#include "my_data_process_base.h"class MY_data_process_TYPE_A_DIR_RIGHT : public MY_data_process_base{public: MY_data_process_TYPE_A_DIR_RIGHT(void); virtual ~MY_data_process_TYPE_A_DIR_RIGHT(void); virtual unsigned int process(const unsigned char* puc_data, int i_data_len);};#endif // #define ___TESTCASE_TEST_DATA_FACTORY_MY_DATA_PROCESS_TYPE_A_DIR_RIGHT_H__
// @file \testcase\test_data_factory\MY_data_process_TYPE_A_DIR_RIGHT.cpp#include "MY_data_process_TYPE_A_DIR_RIGHT.h"MY_data_process_TYPE_A_DIR_RIGHT::MY_data_process_TYPE_A_DIR_RIGHT(void){}MY_data_process_TYPE_A_DIR_RIGHT::~MY_data_process_TYPE_A_DIR_RIGHT(void){}unsigned int MY_data_process_TYPE_A_DIR_RIGHT::process(const unsigned char* puc_data, int i_data_len){ return MY_DATA_PROCESS_ERR;}
// @file : \testcase\test_data_factory\MY_data_process_TYPE_B_DIR_DOWN.h// @brief : ...#ifndef ___TESTCASE_TEST_DATA_FACTORY_MY_DATA_PROCESS_TYPE_B_DIR_DOWN_H__#define ___TESTCASE_TEST_DATA_FACTORY_MY_DATA_PROCESS_TYPE_B_DIR_DOWN_H__#include "my_data_process_base.h"class MY_data_process_TYPE_B_DIR_DOWN : public MY_data_process_base{public: MY_data_process_TYPE_B_DIR_DOWN(void); virtual ~MY_data_process_TYPE_B_DIR_DOWN(void); virtual unsigned int process(const unsigned char* puc_data, int i_data_len);};#endif // #define ___TESTCASE_TEST_DATA_FACTORY_MY_DATA_PROCESS_TYPE_B_DIR_DOWN_H__
// @file \testcase\test_data_factory\MY_data_process_TYPE_B_DIR_DOWN.cpp#include "MY_data_process_TYPE_B_DIR_DOWN.h"MY_data_process_TYPE_B_DIR_DOWN::MY_data_process_TYPE_B_DIR_DOWN(void){}MY_data_process_TYPE_B_DIR_DOWN::~MY_data_process_TYPE_B_DIR_DOWN(void){}unsigned int MY_data_process_TYPE_B_DIR_DOWN::process(const unsigned char* puc_data, int i_data_len){ return MY_DATA_PROCESS_ERR;}
转载地址:https://lostspeed.blog.csdn.net/article/details/79195098 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
关注你微信了!
[***.104.42.241]2024年05月04日 15时35分39秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Spring Boot 安全框架 Shiro 入门
2019-05-01
如何用一句话激怒互联网人?
2019-05-01
用 Python 爬了点你们喜欢的电影
2019-05-01
推荐一位川大零基础转行 Python 的人生勇士
2019-05-01
讲真,做Python一定不要只会一个方向!
2019-05-01
Python 2大限来了!113天后自生自灭,官方不再维护更新
2019-05-01
GitHub 热榜第一的 Python 抢票神器!节假日能用上
2019-05-01
1.6w 星开源项目,但作者月薪却不到 5K
2019-05-01
Python解惑之:整数比较
2019-05-01
Python解惑之:True与False
2019-05-01
你要的微信小程序终于来了
2019-05-01
我的2016书单
2019-05-01
冷眼看小程序
2019-05-01
为什么执行 x in range(y) 如此快?
2019-05-01
看完这篇文章你还不理解 Python 装饰器,只有一种可能...
2019-05-01
Python干货:表达式 i += x 与 i = i + x 等价吗?
2019-05-01
有了这些 Chrome 插件,效率提升10倍(建议收藏)
2019-05-01
Python 编码错误的本质原因
2019-05-01
Python 开发者都会遇到的错误:UnboundLocalError
2019-05-01
用 Python 送“爱心”
2019-05-01