123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- #pragma once
- //说明:一个模板工厂类,先调用注册类进行注册,注册后便可以通过传入字符串生成指定子类
- //注册,example(static ProductRegistrar<DeviceBase, RingLight> device_ringlight("ringlight");)
- // 基类,产品注册模板接口类
- // 模板参数 ProductType_t 表示的类是产品抽象类
- 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&);
- };
- // 工厂模板类,用于获取和注册产品对象
- // 模板参数 ProductType_t 表示的类是产品抽象类
- 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;
- }
- // 根据名字name,获取对应具体的产品对象
- ProductType_t* GetProduct(string name)
- {
- // 从map找到已经注册过的产品,并返回产品对象
- if (m_ProductRegistry.find(name) != m_ProductRegistry.end())
- {
- return m_ProductRegistry[name]->CreateProduct();
- }
- // 未注册的产品,则报错未找到
- //std::cout << "No product found for " << name << std::endl;
- return NULL;
- }
- private:
- // 禁止外部构造和虚构
- ProductFactory() {}
- ~ProductFactory() {}
- // 禁止外部拷贝和赋值操作
- ProductFactory(const ProductFactory&);
- const ProductFactory& operator=(const ProductFactory&);
- // 保存注册过的产品,key:产品名字 , value:产品类型
- map<string, IProductRegistrar<ProductType_t>*> m_ProductRegistry;
- };
- // 产品注册模板类,用于创建具体产品和从工厂里注册产品
- // 模板参数 ProductType_t 表示的类是产品抽象类(基类),ProductImpl_t 表示的类是具体产品(产品种类的子类)
- 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();
- }
- };
|