template class BaseFactory { public: virtual BaseType* create() = 0; }; template class DerivedFactory : public BaseFactory { public: virtual BaseType* create() { return new T(); } }; template class ChildFactoryMap { private: typedef std::map*> MapType; MapType derivedFactories; public: ~ChildFactoryMap() { for(typename MapType::iterator i = derivedFactories.begin(); i != derivedFactories.end(); ++i) { delete i->second; } } template void addType(const KeyType& key) { derivedFactories.insert(typename MapType::value_type(key, new DerivedFactory); } BaseType* create(const KeyType& key) { return derivedFactories.get(key)->create(); } };