#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;
}