one template factory

来源:互联网 发布:淘宝坑店知乎 编辑:程序博客网 时间:2024/05/30 23:51
#ifndef ProductFactory_H_#define ProductFactory_H_#include <map>template <typename Key, typename Product>struct creator_traits{typedef Product*PlainPointer;typedef Product*(*ProductCreator)();typedef std::map<Key, ProductCreator>ProductCreatorCollection;typedef void(*ProductDestroyor)(Product*);typedef std::map<Key, ProductDestroyor>ProductDestroyorCollection;};template<typename Key,typename Product,typename PlainPointer = typename creator_traits<Key, Product>::PlainPointer,typename ProductCreator = typename creator_traits<Key, Product>::ProductCreator,typename ProductCreatorCollection = typename creator_traits<Key, Product>::ProductCreatorCollection,typename ProductDestroyor = typename creator_traits<Key, Product>::ProductDestroyor,typename ProductDestroyorCollection = typename creator_traits<Key, Product>::ProductDestroyorCollection,>class ProductFactoryT{public:typedef Product ProductType;typedef ProductCreator ProductPtrCreator;typedef PlainPointer ProductPtr;typedef ProductDestroyor ProductPtrDestroyor;protected:ProductCreatorCollectionmyCreators;ProductDestroyorCollectionmyDestroyors;public:virtual bool addCreator(const Key &key, Creator creator){return myCreators.insert(std::make_pair<Key, Creator>(key, creator)).second;}virtual void removeCreator(const Key& key){myCreators.erase(key);}virtual PlainPointer create(const Key& key){if (myCreators.count(key)){return myCreators[key]();}}virtual bool exist(const Key& key){if (myCreators.find(key) != myCreators.end()){return true;}return false;}virtual bool addDestoryor(const Key&key, Destroyor destroyor){if (myDestroyors.find(key) == myDestroyors.end()){myDestroyors.insert(std::make_pair<Key, Creator>(key, creator));}return true;}virtual bool destroy(const Key&key, ProductPtr productPrt){if (myDestroyors.count(key)){myDestroyors[key](productPrt);return true;}else{return false;}}virtual void clear(){myCreators.clear();myDestroyors.clear();}};class MyClass{public:MyClass();~MyClass();private:};typedef ProductFactoryT<std::string,MyClass,creator_traits<std::string, MyClass>::PlainPointer,creator_traits<std::string, MyClass>::ProductCreator,creator_traits<std::string, MyClass>::ProductCreatorCollection> myFactory;myFactory myFactoryInstanse;//load myFactory::ProductPtrCreator myClassCreatorPtr = (myFactory::ProductPtrCreator)Library->getSymbol("create");myFactoryInstanse.addCreator("createMyClassGUID", myClassCreatorPtr);MyClass myc = myFactoryInstanse.create(createMyClassGUID);#endif // !ProductFactory_H_

0 0
原创粉丝点击