背景:主要是解决,在不同的情况下需要创建不同类型对象,然后对该对象进行操作。比如:任务类型,我们可能就分了: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;
}