6.对象工厂基类
//MyObjectFactoryBase.h
#pragma once
#include "MyCreateObjectFunction.h"
#include <list>
#include <vector>
#include <string>
//
//关于对象工厂,参考上面给出的文章,写得很不错,关于泛化对象工厂的原理阐述的很清晰.
//泛化对象工厂: http://blog.csdn.net/azure1987/archive/2009/10/27/4732355.aspx
//
//一个 multimap, 用来存储识别对象工厂的信息,及其可以创建的对象的版本信息
class OverRideMap;
//
//MyObjectFactoryBase: 工厂基类, ITK 中几乎所有对象都是通过相应的对象工厂创建
//MyObjectFactoryBase 中包含一个静态方法 CreateInstance(), 该方法通过已注册的对象工厂创建对象
//第一次调用 CreateInstance(), ITK 环境变量路径中所有的 dll 或者 静态库都被加载到当前进程
//为了加载环境变量中的动态或静态库到当前进程, ITK 中又使用了其它库, 我将这部分省略掉
//
//1.对象工厂能够在运行时进行版本替换
// 在程序中通过变量 m_EnabledFlag 进行控制是否可能创建特定版本的对象实例.
//2.使用 multimap 存储识别对象工厂的信息, 这样一个对象工厂中可以有相同 key 的对象
// 我们在程序中演示了如何通过设置 m_EnabledFlag 创建不同版本的对象
//3.代码中的一些方法如 GetDescription 是用来输出对象工厂信息的
// SetEnableFlag 等是用来控制创建对象的哪一个版本
//
class MyObjectFactoryBase : public MyObject
{
public:
typedef MyObjectFactoryBase Self;
typedef MyObject Superclass;
typedef MySmartPointer<Self> Pointer;
typedef MySmartPointer<const Self> ConstPointer;
//virtual const char* GetNameOfClass() const;
MyTypeMacro(MyObjectFactoryBase, MyObject);
//返回一个名为 classname 的类对象实例
//每个被加载的 MyObjectFactoryBase 都会按环境变量中的顺序被询问
//一旦有一个工厂成功创建对象并返回, 其余工厂便不再被询问.
static MyObject::Pointer CreateInstance(const char* classname);
/////////////////////////////
//注册/注销 对象工厂
static void RegisterFactory(MyObjectFactoryBase* );
static void UnRegisterFactory(MyObjectFactoryBase*);
static void UnRegisterAllFactories();
////////////////////////////
//返回包含所有已注册的对象工厂的链表
static std::list<MyObjectFactoryBase*> GetRegisteredFactories();
virtual const char* GetDescription(void) const = 0; //描述该对象工厂
//描述对象工厂及其能够创建的对象
virtual std::list<std::string> GetClassOverrideNames();
virtual std::list<std::string> GetClassOverrideWithNames();
virtual std::list<std::string> GetClassOverrideDescriptions();
/////////////////////////////
//m_EnabledFlag:用来控制使用哪一个版本的类来创建对象, 以达到动态替换的目标
virtual std::list<bool> GetEnableFlags();
//设置/取得 指定版本类的 m_EnabledFlag 标志.
virtual void SetEnableFlag(bool flag,
const char* className, const char* subclassName);
virtual bool GetEnableFlag(const char* className, const char* subclassName);
//Disable: 将使对象工厂不能创建该类的任何版本实例
virtual void Disable(const char* className);
//OverrideInformation: 工厂及对象的版本信息, 及是否可以创建
struct OverrideInformation
{
std::string m_Description; //类的描述
std::string m_OverrideWithName; //重载的版本
bool m_EnabledFlag; //指示是否可以创建该版本的对象实例.
MyCreateObjectFunctionBase::Pointer m_CreateObject;
};
protected:
MyObjectFactoryBase();
virtual ~MyObjectFactoryBase();
//注册对象工厂, 以及其可以创建的对象版本的信息
void RegisterOverride(
const char* classOverride,
const char* overrideClassName,
const char* description,
bool enableFlag,
MyCreateObjectFunctionBase* createFunction); //
//对象工厂的子类实现 CreateObject 并返回创建的对象的指针,若不支持则返回 0
virtual MyObject::Pointer CreateObject(const char* classname );
private:
MyObjectFactoryBase(const Self&);
void operator=(const Self&);
static void Initialize(); //初始化
//一个 multimap: 存储对象工厂及其可以创建的对象的版本信息
OverRideMap* m_OverrideMap;
//对象工厂列表, 包含指向已经注册的对象工厂的指针
static std::list<MyObjectFactoryBase*>* m_RegisteredFactories;
};
7.Helper 类
//MyObjectFactory.h
#pragma once
#include "MyObjectFactoryBase.h"
//MyObjectFactory:
//是一个帮助类(a helper class), 实现 Create() 方法, 用于创建一个对象实例.
//对象工厂允许在运行时进行替换.
//对象工厂通过运行时类型识别 RTTI 实现.
template <class T>
class MyObjectFactory : public MyObjectFactoryBase
{
public:
static typename T::Pointer Create()
{
MyObject::Pointer ret = MyObjectFactory::CreateInstance(typeid(T).name());
//ObjectType *GetPointer () const { return m_Pointer; }
//取得原始指针, 将其向下类型转换为 T*
return dynamic_cast<T*>(ret.GetPointer());
}
};
8.临界区类实现
//MyFastMutexLock.h
#pragma once
//不同的平台需要定义不同的类型,这里只给出 windows32 例子
//不同平台在处理时有相应的优化策略, 以保证操作的原子性.
#if defined(_WIN32)
#include "Windows.h"
#include <winbase.h>
typedef CRITICAL_SECTION FastMutexType;
#endif
//为了演示, 完全可以只使用 int 即可, 但无法提供真正的加锁功能
#ifndef _WIN32
typedef int FastMutexType;
#endif
//临界区锁类: 在修改临界值时, 对其加锁, 以保证修改的唯一原子性.
class MyFastMutexLock
{
public:
typedef MyFastMutexLock Self;
//可以在栈上创建临界区对象, 所以将构造函数与析构函数设为 pubilc.
MyFastMutexLock();
~MyFastMutexLock();
//Lock, 加锁, 使其它任何对象都不能修改被加锁的对象
void Lock() const;
//Unlock, 解锁
void Unlock() const;
protected:
mutable FastMutexType m_FastMutexLock;
};
9.MyObject 类的方法实现
//MyObject.h
#pragma once
#include "MyMacro.h"
#include "MyFastMutexLock.h"
#include "MySmartPointer.h"
#if defined(_WIN32)
//To get LONG defined
#include "Windows.h"
#endif
//MyObject 几乎是所有对象的基类, 实现引用计数功能,
//代码基本来 ITK 中的 LightObject 类, LightObject 在 ITK 中是最顶层的类.
class MyObject
{
public:
typedef MyObject Self;
typedef MySmartPointer<Self> Pointer; //包装为智能指针
typedef MySmartPointer<const Self> ConstPointer;
//通过对象工厂创建对象的实例
static Pointer New();
//根据已存在的对象创建一新的对象实例,允许用户创建一个完全相同的对象
//这在需要向上类型转换时非常有用***
virtual Pointer CreateAnother() const;
//使用 New() 的对象, 应该使用 Delete()
//Delete() 会调用 UnRegister 减少引用计数
//只有当该对象的引用计数减为 0 时才会真正删除对象
virtual void Delete();
//运行时类型识别, 返回某对象的具体类名.
virtual const char *GetNameOfClass() const
{return "MyObject";}
//Used to avoid dll boundary problems.
void* operator new(size_t);
void* operator new[](size_t);
void operator delete(void*);
void operator delete[](void*, size_t);
//增加与减少引用计数
virtual void Register() const;
virtual void UnRegister() const;
//返回该类对象实例的引用计数
virtual int GetReferenceCount() const
{ return static_cast<int>(m_ReferenceCount); }
//设置该类对象的引用计数值.
virtual void SetReferenceCount(int);
protected:
MyObject() : m_ReferenceCount(1) { }
virtual ~MyObject();
//不同的平台, 需要定义不同的类型, 这里只简单使用 int 型. 引用计数.
#if (defined(WIN32) || defined(_WIN32))
typedef LONG InternalReferenceCountType;
#else
typedef int InternalReferenceCountType;
#endif
//引用计数
mutable InternalReferenceCountType m_ReferenceCount;
//mutable int m_ReferenceCount;
//临界区锁, 用于对临界区变量加锁
mutable MyFastMutexLock m_ReferenceCountLock;
private:
MyObject(const Self&);
void operator=(const Self&);
};
10.对象工厂基类实现
#if defined(_MSC_VER)
#pragma warning ( disable : 4786 )
#endif
#include "MyObjectFactoryBase.h"
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <algorithm>
#include <map>
//////////////////////////////////////////////////////
//该类用于清除所有已经注册的对象工厂.
class CleanUpObjectFactory
{
public:
inline void Use(){ }
~CleanUpObjectFactory()
{
MyObjectFactoryBase::UnRegisterAllFactories();
}
};
//定义一全局静态变量, 在程序生命周期结束时析构, 用于注销所有对象工厂
static CleanUpObjectFactory CleanUpObjectFactoryGlobal;
////////////////////////////////////////
//StringOverMap, 使用 typedef 进行类型定义, 避免出现名字过长的警告.
typedef std::multimap<std::string,
MyObjectFactoryBase::OverrideInformation> StringOverMapType;
//用于存储 <classID, facotoryInfo>
//classID 对象工厂的标识
//factoryInfo 该对象工厂的信息, 包含其可以创建的对象的所有版本信息
class OverRideMap : public StringOverMapType
{
};
/////////////////////////////////////////////////////
//静态变量初始化, 已注册的对象工厂链表.
std::list<MyObjectFactoryBase*>*
MyObjectFactoryBase::m_RegisteredFactories = 0;
//构造函数
MyObjectFactoryBase::MyObjectFactoryBase()
{
m_OverrideMap = new OverRideMap;
}
//析构, 卸载已加载的对象工厂.
MyObjectFactoryBase::~MyObjectFactoryBase()
{
m_OverrideMap->erase(m_OverrideMap->begin(), m_OverrideMap->end());
delete m_OverrideMap;
}
//使用已注册的对象工厂创建类名为 classname 的对象实例.
MyObject::Pointer
MyObjectFactoryBase::CreateInstance(const char* classname)
{
if( !MyObjectFactoryBase::m_RegisteredFactories )
{
MyObjectFactoryBase::Initialize();
}
for( std::list<MyObjectFactoryBase*>::iterator
i = m_RegisteredFactories->begin();
i != m_RegisteredFactories->end(); ++i )
{
//遍历已注册的对象列表, 如果某个对象工厂成功创建对象, 则返回
MyObject::Pointer newobject = (*i)->CreateObject(classname);
if(newobject)
{
newobject->Register();
return newobject;
}
}
return 0;
}
//初始化
void MyObjectFactoryBase::Initialize()
{
//全局静态变量, 用于最后注销所有的对象工厂
CleanUpObjectFactoryGlobal.Use();
//已经初始化过了, 返回
if( MyObjectFactoryBase::m_RegisteredFactories )
{
return;
}
MyObjectFactoryBase::m_RegisteredFactories =
new std::list<MyObjectFactoryBase*>;
}
//注册对象工厂, 添加至链表中.
void MyObjectFactoryBase::RegisterFactory(MyObjectFactoryBase* factory)
{
//先进行初始化,然后将该对象工厂加入到对象工厂链表中
MyObjectFactoryBase::Initialize();
MyObjectFactoryBase::m_RegisteredFactories->push_back(factory);
factory->Register();
}
//清除已经清册的名为 factory 的对象工厂
void MyObjectFactoryBase::UnRegisterFactory(MyObjectFactoryBase* factory)
{
if( !MyObjectFactoryBase::m_RegisteredFactories )
return;
for ( std::list<MyObjectFactoryBase*>::iterator
i = m_RegisteredFactories->begin();
i != m_RegisteredFactories->end(); ++i )
{
if ( factory == *i )
{
factory->UnRegister();
m_RegisteredFactories->remove(factory);
return;
}
}
}
//清除所有已注册的对象工厂, 并删除对象工厂列表
void MyObjectFactoryBase::UnRegisterAllFactories()
{
if ( MyObjectFactoryBase::m_RegisteredFactories )
{
for ( std::list<MyObjectFactoryBase*>::iterator
f = m_RegisteredFactories->begin();
f != m_RegisteredFactories->end(); ++f )
{
(*f)->UnRegister();
}
//删除对象工厂链表...
delete MyObjectFactoryBase::m_RegisteredFactories;
MyObjectFactoryBase::m_RegisteredFactories = 0;
}
}
//返回包含所有已注册的对象工厂的链表...
std::list<MyObjectFactoryBase*>
MyObjectFactoryBase::GetRegisteredFactories()
{
return *MyObjectFactoryBase::m_RegisteredFactories;
}
///////////////////////////////
//描述对象工厂及其能够创建的对象
std::list<std::string>
MyObjectFactoryBase::GetClassOverrideNames()
{
std::list<std::string> ret;
for ( OverRideMap::iterator i = m_OverrideMap->begin();
i != m_OverrideMap->end(); ++i )
{
ret.push_back((*i).first);
}
return ret;
}
std::list<std::string>
MyObjectFactoryBase::GetClassOverrideWithNames()
{
std::list<std::string> ret;
for ( OverRideMap::iterator i = m_OverrideMap->begin();
i != m_OverrideMap->end(); ++i )
{
ret.push_back((*i).second.m_OverrideWithName);
}
return ret;
}
std::list<std::string>
MyObjectFactoryBase::GetClassOverrideDescriptions()
{
std::list<std::string> ret;
for ( OverRideMap::iterator i = m_OverrideMap->begin();
i != m_OverrideMap->end(); ++i )
{
ret.push_back((*i).second.m_Description);
}
return ret;
}
//注册对象工厂, 以及其可以创建的对象的版本信息
void MyObjectFactoryBase::RegisterOverride(
const char* classOverride,
const char* subclass,
const char* description,
bool enableFlag,
MyCreateObjectFunctionBase* createFunction)
{
MyObjectFactoryBase::OverrideInformation info;
info.m_Description = description;
info.m_OverrideWithName = subclass; //具体的子类
info.m_EnabledFlag = enableFlag; //是否使用该子类版本
info.m_CreateObject = createFunction;
m_OverrideMap->insert(OverRideMap::value_type(classOverride, info));
}
//
MyObject::Pointer
MyObjectFactoryBase::CreateObject(const char* classname)
{
OverRideMap::iterator start = m_OverrideMap->lower_bound(classname);
OverRideMap::iterator end = m_OverrideMap->upper_bound(classname);
int m = 0;
for ( OverRideMap::iterator i = start; i != end; ++i )
{
//(*i).second.m_EnabledFlag = true; 则使用该工厂创建该版本的对象实例
if ( i != m_OverrideMap->end() && (*i).second.m_EnabledFlag)
{
//调用了 MyCreateObjectFunction::CreateObject();
//MyCreateObjectFunction 是用于创建对象的回调函数
return (*i).second.m_CreateObject->CreateObject();
}
}
return 0;
}
///////////////////////////
//m_EnabledFlag: 控制对象工厂可以创建的对象版本
void MyObjectFactoryBase::SetEnableFlag(bool flag,
const char* className,const char* subclassName)
{
OverRideMap::iterator start = m_OverrideMap->lower_bound(className);
OverRideMap::iterator end = m_OverrideMap->upper_bound(className);
for ( OverRideMap::iterator i = start; i != end; ++i )
{
if ( (*i).second.m_OverrideWithName == subclassName )
{
(*i).second.m_EnabledFlag = flag;
}
}
}
bool MyObjectFactoryBase
::GetEnableFlag(const char* className, const char* subclassName)
{
OverRideMap::iterator start = m_OverrideMap->lower_bound(className);
OverRideMap::iterator end = m_OverrideMap->upper_bound(className);
for ( OverRideMap::iterator i = start; i != end; ++i )
{
if ( (*i).second.m_OverrideWithName == subclassName )
{
return (*i).second.m_EnabledFlag;
}
}
return 0;
}
void MyObjectFactoryBase::Disable(const char* className)
{
OverRideMap::iterator start = m_OverrideMap->lower_bound(className);
OverRideMap::iterator end = m_OverrideMap->upper_bound(className);
for ( OverRideMap::iterator i = start; i != end; ++i )
{
(*i).second.m_EnabledFlag = 0;
}
}
std::list<bool>
MyObjectFactoryBase::GetEnableFlags()
{
std::list<bool> ret;
for( OverRideMap::iterator i = m_OverrideMap->begin();
i != m_OverrideMap->end(); ++i)
{
ret.push_back((*i).second.m_EnabledFlag);
}
return ret;
}