123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- #pragma once
- template <class ProductType_t>
- class IProductRegistrar
- {
- public:
-
- virtual ProductType_t* CreateProduct() = 0;
- protected:
-
- IProductRegistrar() {}
- virtual ~IProductRegistrar() {}
- private:
-
- IProductRegistrar(const IProductRegistrar&);
- const IProductRegistrar& operator=(const IProductRegistrar&);
- };
- template <class ProductType_t>
- class ProductFactory
- {
- public:
-
- static ProductFactory<ProductType_t>& Instance()
- {
- static ProductFactory<ProductType_t> instance;
- return instance;
- }
-
- void RegisterProduct(IProductRegistrar<ProductType_t>* registrar, string name)
- {
- m_ProductRegistry[name] = registrar;
- }
-
- ProductType_t* GetProduct(string name)
- {
-
- if (m_ProductRegistry.find(name) != m_ProductRegistry.end())
- {
- return m_ProductRegistry[name]->CreateProduct();
- }
-
-
- return NULL;
- }
- private:
-
- ProductFactory() {}
- ~ProductFactory() {}
-
- ProductFactory(const ProductFactory&);
- const ProductFactory& operator=(const ProductFactory&);
-
- map<string, IProductRegistrar<ProductType_t>*> m_ProductRegistry;
- };
- template <class ProductType_t, class ProductImpl_t>
- class ProductRegistrar : public IProductRegistrar<ProductType_t>
- {
- public:
-
- explicit ProductRegistrar(string name)
- {
-
- ProductFactory<ProductType_t>::Instance().RegisterProduct(this, name);
- }
-
- ProductType_t* CreateProduct()
- {
- return new ProductImpl_t();
- }
- };
|