C++ 工廠方法

Singleton.h
#pragma once
#ifndef SINGLETON_H
#define SINGLETON_H

template<class T>
class Singleton
{
public:
	static T& Instance();

protected:
	Singleton(){}
	virtual ~Singleton(){}

	/**
	 * 防止拷貝複製
	 */
private:
	Singleton(const Singleton &);
	Singleton & operator = (const Singleton &);
};

template<class T>
T& Singleton<T>::Instance()
{
	/** 建立一個靜態對象 */
	static T instance;
	return instance;
}

#endif

ObjectFactory.h
/**--------------------------------
* 對象工廠模式(Object Factory)
*
* Code by XadillaX
* http://www.xcoder.in
* Created at 2010-11-17 1:33
*/ 
#ifndef OBJECTFACTORY_H 
#define OBJECTFACTORY_H 

#pragma once 
#include <map> 
#include <string> 
#include "Singleton.h" 

template<class T> 
class ObjectFactory : public Singleton<ObjectFactory<T>> 
{ 
public: 
	typedef T* (*tCreator)(); ///< 重定義對象生成函數指針 
	typedef std::map<std::string, tCreator> tCreatorMap; ///< 對象生成函數指針map 

	/**
	* @brief 註冊新"生產車間"
	* 將生成對象的函數加入對象工廠
	*
	* @param *name 類名稱
	* @param procedure "生產"對象的函數
	* @return 是否成功註冊
	*/ 
	bool Register(char *type, tCreator procedure); 

	/**
	* @brief 找到"生產車間"
	* 根據傳入的類名返回相應的新對象的生成函數
	*
	* @param &type 類名
	* @return 相應的新對象的生成函數
	*/ 
	T* Create(const std::string &type); 

private: 
	/** "生產車間"映射 */ 
	tCreatorMap _map; 
}; 

template<class T> 
bool ObjectFactory<T>::Register(char *type, tCreator procedure) 
{ 
	string tmp(type); 
	/** 將新函數加入map中 */ 
	_map[tmp] = procedure; 
	return _map[tmp]; 
} 

template<class T> 
T* ObjectFactory<T>::Create(const std::string &type) 
{ 
	/** 在映射中找到相應"生產車間" */ 
	tCreatorMap::iterator iter = _map.find(type); 

	/** 檢測"車間"是否存在 */ 
	if(iter != _map.end()) 
	{ 
		/** 讓返回值爲相應的"生產車間" */ 
		tCreator r = iter->second; 

		/** 返回"生產車間" */ 
		return r(); 
	} 

	return 0; 
} 

#endif 

Main.cpp
 #include <iostream> 
#include "ObjectFactory.h" 
using namespace std; 

/** 基類 */ 
class Base; 

/** Base類及其子類的對象工廠 */ 
typedef ObjectFactory<Base> BaseFactory; 

class Base 
{ 
public: 
	Base(){}; 
	~Base(){}; 
}; 

class A : public Base 
{ 
public: 
	A(){ cout << "A object created." << endl; }; 
	~A(){}; 
	static Base* ACreator() 
	{ 
		return new A(); 
	};
}; 

class B : public Base 
{ 
public: 
	B(){ cout << "B object Created." << endl; } 
	~B(); 
	static Base* BCreator() 
	{ 
		return new B(); 
	} 
}; 

/**
* @brief 主函數
*/ 
int main() 
{ 
	/** 將A、B的"生產車間"註冊到對象工廠中 */ 
	bool AFlag = BaseFactory::Instance().Register("A", A::ACreator);
	bool BFlag = BaseFactory::Instance().Register("B", B::BCreator); 

	/** 若註冊失敗則退出 */ 
	if(!AFlag || !BFlag) exit(0); 

	Base *p; 
	for(int i = 0; i < 10; i++) 
	{ 
		string type = (i % 2) ? string("A") : string("B"); 

		/** p用相應"生產車間"進行生產 */ 
		p = BaseFactory::Instance().Create(type); 

		delete p; 
	} 

	return 0; 
} 


發佈了11 篇原創文章 · 獲贊 6 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章