【设计模式】简单工厂类模式<初探>

 



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

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值