#pragma once namespace shared { class TemplatedObjectFactoryWrapper; /* 类名:TemplatedObjectFactory 功能:根据注册类型的信息创建一个TOBJFLG的实例,类型TBase应是TOBJFLG的父类 */ template class TemplatedObjectFactory : public nbase::Singleton> { private: using _ParentType = nbase::Singleton>; using _MyType = TemplatedObjectFactory; friend class TemplatedObjectFactoryWrapper; public: TemplatedObjectFactory() = default; ~TemplatedObjectFactory() = default; private: /* 创建TClass实例的方法, 存在TClass : public TBase的关系 params TClass的构造参数 返回TBase类型的指针对像 */ template TBase* Create(const TParam&... params) { return dynamic_cast(new TClass(params...)); } template void AddCreateFunction(TOBJFLG flg, const TParam&... params) { auto it = std::find_if(crate_function_list_.begin(), crate_function_list_.end(), [&](const decltype(*crate_function_list_.begin()) & item){ return flg == item.first; }); if (it == crate_function_list_.end()) crate_function_list_.emplace_back(std::make_pair(flg, std::bind(&TemplatedObjectFactory::Create, this, params...))); } auto CreateSharedObject(TOBJFLG flg)->std::shared_ptr { auto it = std::find_if(crate_function_list_.begin(), crate_function_list_.end(), [&](const decltype(*crate_function_list_.begin()) & item){ return flg == item.first; }); if (it != crate_function_list_.end()) return std::shared_ptr((*it).second()); return nullptr; } TBase* CreateObject(TOBJFLG flg) { TBase* ret = nullptr; auto it = std::find_if(crate_function_list_.begin(), crate_function_list_.end(), [&](const decltype(*crate_function_list_.begin()) & item){ return flg == item.first; }); if (it != crate_function_list_.end()) ret = (*it).second(); return ret; } void CreateAllSharedObject(std::list>& objects) { for (auto it : crate_function_list_) objects.emplace_back(std::shared_ptr(it.second())); } private: std::list>> crate_function_list_; }; class TemplatedObjectFactoryWrapper { public: //注册类型 template static void RegisteredOjbect(const TOBJFLG& flg, const TParam&... params) { using TDecayType = typename std::decay::type; if (std::is_base_of::value) { auto&& manager = TemplatedObjectFactory::GetInstance(); if (manager != nullptr) manager->AddCreateFunction(flg, params...); } } //创建含引用计数的实例 template static auto InstantiateSharedRegisteredOjbect(const TFLG& flag)->std::shared_ptr { using TDecayType = typename std::decay::type; auto&& manager = TemplatedObjectFactory::GetInstance(); if (manager != nullptr) return manager->CreateSharedObject(flag); return nullptr; } //创建实例 template static auto InstantiateRegisteredOjbect(const TFLG& flag)->TBase* { using TDecayType = typename std::decay::type; auto&& manager = TemplatedObjectFactory::GetInstance(); if (manager != nullptr) return manager->CreateObject(flag); return nullptr; } //创建所有已注册为 TBase 与 TFLG 为标识的的实例 template static auto InstantiateAllRegisteredSharedOjbect()->std::list> { using TDecayType = typename std::decay::type; std::list> ret; auto&& manager = TemplatedObjectFactory::GetInstance(); if (manager != nullptr) manager->CreateAllSharedObject(ret); return ret; } }; }