C++设计模式:简单工厂类模式<初探>

来源:互联网 发布:人工智能语音识别 编辑:程序博客网 时间:2024/06/13 03:13


背景:主要是解决,在不同的情况下需要创建不同类型对象,然后对该对象进行操作。比如:任务类型,我们可能就分了:A任务,B任务,C任务...自然而然,我们首先会去定义个基任务类型:CBaskTask,然后派生出,CChildTask1、CChildTask2、CChildTask3...在不同的场景下,我们可能要建立不同的类型任务,然后对其进行操作。我们总不能用switch-case来进行判断吧,那当派生出来的子任务类型多的时候,操作将非常的繁琐。所以针对这样的问题,我们采用了设计模式的一种:工厂模式的思想:就是我的厂子里,提前生产出需要用到的类型,那么客户想要什么类型的东西,直接到厂子里拿就可以了。

基类任务类型:

#pragma once#include "stdafx.h"class CBaseTask{public:virtual void Transfer() = 0;virtual void StopTransfer() = 0;};

子类任务类型:

#pragma once#include "BaseTask.h"class CChild1Task : public CBaseTask{public:void Transfer(){std::cout << "Do Child1 Task..." << std::endl;};void StopTransfer(){delete this;};static CBaseTask* TaskNew(){return new CChild1Task();};};class CChild2Task : public CBaseTask{public:void Transfer(){std::cout << "Do Child2 Task..." << std::endl;};void StopTransfer(){delete this;};static CBaseTask* TaskNew(){return new CChild2Task();};};
工厂类:

#pragma once#include "ChildTask.h"//typedef CBaseTask* (*TaskNewFun)();typedef std::map<std::string, CBaseTask*> Factorymap;class CFactory{private:CFactory(){Register("Child1", CChild1Task::TaskNew());Register("Child2", CChild2Task::TaskNew());};CFactory& operator= (const CFactory&){return *this;};void Register(const std::string& v_szTaskName, CBaseTask* v_pfnTaskNew){m_Factorymap[v_szTaskName] = v_pfnTaskNew;};Factorymap m_Factorymap;public:~CFactory(){m_Factorymap.clear();};static CFactory* Get(){static CFactory instance;return &instance;};CBaseTask* TaskNew(const std::string& v_szTaskName){Factorymap::iterator it = m_Factorymap.find(v_szTaskName);if(it != m_Factorymap.end()){return it->second;}return NULL;};};

实例化应用:

// FactoryMode.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "Factory.h"int _tmain(int argc, _TCHAR* argv[]){CBaseTask* pTask = CFactory::Get()->TaskNew("Child3");if(pTask){pTask->Transfer();}else{std::cout << "The Task doesn't exist in the factory..." << std::endl;}if(pTask){pTask->StopTransfer();}pTask = NULL;system("pause");return 0;}