#pragma once #include <iostream> #include <map> using namespace std; class CRootClass { public: virtual void Display() = 0; }; typedef CRootClass* (*CREATECLASSOBJECT)(); class CClassType { public: CClassType(char* szClassName, CREATECLASSOBJECT pfnCreate) { m_pClassName = szClassName; m_pfnCreateClassObject = pfnCreate; m_pNext = CClassType::m_pTheFirst; CClassType::m_pTheFirst = this; } public: static CClassType* m_pTheFirst; CREATECLASSOBJECT m_pfnCreateClassObject; char* m_pClassName; CClassType* m_pNext; }; class AutoRegister; class CDuckClass : public CRootClass { public: static const int m_iTypeID = 1; static CClassType classType; static AutoRegister autoRegister; public: static CRootClass* CreateClassObjecet() { return new CDuckClass; } public: virtual void Display() { cout << "this is a CDuckClass Object" << endl; } }; class CCockClass : public CRootClass { public: static const int m_iTypeID = 2; static CClassType classType; static AutoRegister autoRegister; public: static CRootClass* CreateClassObjecet() { return new CCockClass; } public: virtual void Display() { cout << "this is a CCockClass Object" << endl; } }; class CMonkeyClass : public CRootClass { public: static const int m_iTypeID = 3; static CClassType classType; static AutoRegister autoRegister; public: static CRootClass* CreateClassObjecet() { return new CMonkeyClass; } public: virtual void Display() { cout << "this is a CMonkeyClass Object" << endl; } }; class AnimalFactory { public: static AnimalFactory* GetInstance() { if (NULL == m_pInstance) { m_pInstance = new AnimalFactory; } return m_pInstance; } bool RegisterType(int, CREATECLASSOBJECT); bool DeregisterType(int); CRootClass* CreateClassObject(int iTypeId); private: AnimalFactory(){} AnimalFactory(const AnimalFactory&){} private: static AnimalFactory* m_pInstance; map<int, CREATECLASSOBJECT> m_animalTypeMap; }; class AutoRegister { public: AutoRegister(int iTypeID, CREATECLASSOBJECT pfnCreateObject) { AnimalFactory::GetInstance()->RegisterType(iTypeID, pfnCreateObject); } }; 源文件 #include "Dynamic.h" CClassType* CClassType::m_pTheFirst = 0; CClassType CDuckClass::classType("CDuckClass", CreateClassObjecet); CClassType CCockClass::classType("CCockClass", CreateClassObjecet); CClassType CMonkeyClass::classType("CMonkeyClass", CreateClassObjecet); AutoRegister CDuckClass::autoRegister(m_iTypeID, CreateClassObjecet); AutoRegister CCockClass::autoRegister(m_iTypeID, CreateClassObjecet); AutoRegister CMonkeyClass::autoRegister(m_iTypeID, CreateClassObjecet); AnimalFactory* AnimalFactory::m_pInstance = NULL; bool AnimalFactory::RegisterType(int iTypeID, CREATECLASSOBJECT pfnCreateObject) { return m_animalTypeMap.insert(make_pair(iTypeID, pfnCreateObject)).second; } bool AnimalFactory::DeregisterType(int iTypeID) { return m_animalTypeMap.erase(iTypeID) == 1; } CRootClass* AnimalFactory::CreateClassObject(int iTypeId) { map<int, CREATECLASSOBJECT>::iterator it = m_animalTypeMap.find(iTypeId); if (it != m_animalTypeMap.end()) { return it->second(); } return NULL; }