#pragma once #include #include #include #include template class AbstractCreator { public: virtual ~AbstractCreator() {} virtual std::shared_ptr create(const CreatorParam &id) const = 0; }; template class Creator : public AbstractCreator { public: Creator() {} virtual ~Creator() {} std::shared_ptr create(const CreatorParam ¶ms) const { return std::static_pointer_cast(std::make_shared(params)); } }; template class ObjectFactory { protected: typedef AbstractCreator AbstractFactory; typedef std::map FactoryMap; FactoryMap factory_; public: ObjectFactory() {} virtual ~ObjectFactory() { for (auto& item : factory_) delete item.second; } template void addClass(const IdType &id) { registerClass(id, new Creator()); } template std::shared_ptr createObject(const IdType &idClass, const CreatorParam ¶meters) { return factory_[idClass]->create(parameters); } protected: void registerClass(const IdType &id, AbstractFactory *ConcreteFabric) { typename FactoryMap::iterator it = factory_.find(id); if (it == factory_.end()) factory_[id] = ConcreteFabric; else delete ConcreteFabric; } };