CTemplateFactory.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #pragma once
  2. //说明:一个模板工厂类,先调用注册类进行注册,注册后便可以通过传入字符串生成指定子类
  3. //注册,example(static ProductRegistrar<DeviceBase, RingLight> device_ringlight("ringlight");)
  4. // 基类,产品注册模板接口类
  5. // 模板参数 ProductType_t 表示的类是产品抽象类
  6. template <class ProductType_t>
  7. class IProductRegistrar
  8. {
  9. public:
  10. // 获取产品对象抽象接口
  11. virtual ProductType_t* CreateProduct() = 0;
  12. protected:
  13. // 禁止外部构造和虚构, 子类的"内部"的其他函数可以调用
  14. IProductRegistrar() {}
  15. virtual ~IProductRegistrar() {}
  16. private:
  17. // 禁止外部拷贝和赋值操作
  18. IProductRegistrar(const IProductRegistrar&);
  19. const IProductRegistrar& operator=(const IProductRegistrar&);
  20. };
  21. // 工厂模板类,用于获取和注册产品对象
  22. // 模板参数 ProductType_t 表示的类是产品抽象类
  23. template <class ProductType_t>
  24. class ProductFactory
  25. {
  26. public:
  27. // 获取工厂单例,工厂的实例是唯一的
  28. static ProductFactory<ProductType_t>& Instance()
  29. {
  30. static ProductFactory<ProductType_t> instance;
  31. return instance;
  32. }
  33. // 产品注册
  34. void RegisterProduct(IProductRegistrar<ProductType_t>* registrar, string name)
  35. {
  36. m_ProductRegistry[name] = registrar;
  37. }
  38. // 根据名字name,获取对应具体的产品对象
  39. ProductType_t* GetProduct(string name)
  40. {
  41. // 从map找到已经注册过的产品,并返回产品对象
  42. if (m_ProductRegistry.find(name) != m_ProductRegistry.end())
  43. {
  44. return m_ProductRegistry[name]->CreateProduct();
  45. }
  46. // 未注册的产品,则报错未找到
  47. //std::cout << "No product found for " << name << std::endl;
  48. return NULL;
  49. }
  50. private:
  51. // 禁止外部构造和虚构
  52. ProductFactory() {}
  53. ~ProductFactory() {}
  54. // 禁止外部拷贝和赋值操作
  55. ProductFactory(const ProductFactory&);
  56. const ProductFactory& operator=(const ProductFactory&);
  57. // 保存注册过的产品,key:产品名字 , value:产品类型
  58. map<string, IProductRegistrar<ProductType_t>*> m_ProductRegistry;
  59. };
  60. // 产品注册模板类,用于创建具体产品和从工厂里注册产品
  61. // 模板参数 ProductType_t 表示的类是产品抽象类(基类),ProductImpl_t 表示的类是具体产品(产品种类的子类)
  62. template <class ProductType_t, class ProductImpl_t>
  63. class ProductRegistrar : public IProductRegistrar<ProductType_t>
  64. {
  65. public:
  66. // 构造函数,用于注册产品到工厂,只能显示调用
  67. explicit ProductRegistrar(string name)
  68. {
  69. // 通过工厂单例把产品注册到工厂
  70. ProductFactory<ProductType_t>::Instance().RegisterProduct(this, name);
  71. }
  72. // 创建具体产品对象指针
  73. ProductType_t* CreateProduct()
  74. {
  75. return new ProductImpl_t();
  76. }
  77. };