博客
关于我
C++ 深入浅出工厂模式(进阶篇)
阅读量:502 次
发布时间:2019-03-07

本文共 3222 字,大约阅读时间需要 10 分钟。

优化工厂模式:从模板工厂到产品注册模板类+单例工厂模板类

在前文中,我们探讨了工厂方法模式的局限性:当新增产品时,往往需要修改工厂类或新增具体工厂类,导致工厂类的封装性不足。为了解决这一问题,本文将工厂方法模式进一步优化,提出了模板工厂和产品注册模板类+单例工厂模板类两种方案。

模板工厂

模板工厂通过将工厂类的功能参数化,实现了工厂类的封装性提升。在新增产品时,不需要修改工厂类,也无需新增具体工厂类。这种方式减少了代码编写量,提高了扩展性和复用性。

核心特点

  • 参数化工厂类:模板工厂采用模板参数,将产品的抽象类和具体类统一处理。
  • 减少代码复制:新增产品时,只需扩展具体产品类和工厂类,避免重复代码。
  • 统一管理:通过单例工厂实现工厂对象的唯一性,提升了工厂对象的管理效率。
  • 代码示例

    // 基类 鞋子class Shoes {public:    virtual void Show() = 0;    virtual ~Shoes() {}};// 具体产品类:耐克鞋class NiKeShoes : public Shoes {public:    void Show() {        std::cout << "我是耐克球鞋,我的广告语:Just do it" << std::endl;    }};// 基类 衣服class Clothe {public:    virtual void Show() = 0;    virtual ~Clothe() {}};// 具体产品类:优衣库衣服class UniqloClothe : public Clothe {public:    void Show() {        std::cout << "我是优衣库衣服,我的广告语:I am Uniqlo" << std::endl;    }};// 模板抽象工厂类template 
    class AbstractFactory {public: virtual AbstractProduct_t *CreateProduct() = 0; virtual ~AbstractFactory() {}};// 具体模板工厂类template
    class ConcreteFactory : public AbstractFactory
    {public: AbstractProduct_t *CreateProduct() { return new ConcreteProduct_t; }};

    产品注册模板类+单例工厂模板类

    模板工厂虽然提升了封装性,但仍缺少统一管理产品对象的功能。产品注册模板类+单例工厂模板类进一步优化这一问题。

    核心特点

  • 产品注册模板类:用于注册不同类型产品,通过std::map保存产品对象,支持快速获取。
  • 单例工厂模板类:通过单例设计实现工厂对象的唯一性,支持随时获取指定产品对象。
  • 扩展性高:新增产品时,只需注册产品和创建具体类,不需修改工厂类。
  • 代码示例

    // 产品注册模板类template 
    class IProductRegistrar {public: virtual ProductType_t *CreateProduct() = 0; IProductRegistrar() {} ~IProductRegistrar() {} IProductRegistrar(const IProductRegistrar &) {} const IProductRegistrar &operator=(const IProductRegistrar &) {}};// 单例工厂模板类template
    class ProductFactory {public: static ProductFactory
    &Instance() { static ProductFactory
    instance; return instance; } void RegisterProduct(IProductRegistrar
    *registrar, std::string name) { m_ProductRegistry[name] = registrar; } ProductType_t *GetProduct(std::string name) { 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 &) {} std::map
    *> m_ProductRegistry;};// 产品注册模板类template
    class ProductRegistrar : public IProductRegistrar
    {public: ProductRegistrar(std::string name) { ProductFactory
    ::Instance().RegisterProduct(this, name); } ProductType_t *CreateProduct() { return new ProductImpl_t; }};

    实现示例

    int main() {    // 注册耐克球鞋    ProductRegistrar
    nikeShoes("nike"); Shoes *pNiKeShoes = ProductFactory
    ::Instance().GetProduct("nike"); pNiKeShoes->Show(); // 注册优衣库衣服 ProductRegistrar
    adidasShoes("uniqlo"); Clothe *pUniqloClothe = ProductFactory
    ::Instance().GetProduct("uniqlo"); pUniqloClothe->Show(); delete pNiKeShoes; delete pUniqloClothe; return 0;}

    总结

    通过将工厂方法模式优化为模板工厂,再到产品注册模板类+单例工厂模板类,我们实现了工厂类的高效管理和产品对象的统一获取。这种方式不仅提升了工厂类的封装性和扩展性,还符合开闭原则,使得产品的管理更加灵活和高效。

    转载地址:http://szzcz.baihongyu.com/

    你可能感兴趣的文章
    Python3-selenium自动化测试框架,结合HTMLTestRunner测试报告!
    查看>>
    Python3-如何自我更新作为服务运行的应用程序
    查看>>
    Python3.1-网格模拟概念性问题
    查看>>
    Python3.12 解决conda环境libstdc++版本过低问题
    查看>>
    python3.2批量查询IP地址区域
    查看>>
    Python3.5中协程和未来/任务之间的区别?
    查看>>
    python3.5实现socket通讯(TCP)
    查看>>
    python3.6 ubuntu部署nginx、 uwsgi、 django
    查看>>
    Python3.6.3中,functools似乎不能用
    查看>>
    python3.6.5+cuda9+cudnn7.1+win10+tensorflow-gpu1.9.0下载配置
    查看>>
    python3.6使用pickle序列化class
    查看>>
    python3.6入门到高阶(全栈) day027 网络通信协议 osi七层模型
    查看>>
    Python3.6属性错误:模块‘;异步没有属性‘;运行‘;
    查看>>
    python3.6版本中的python-weka-wrapper安装失败,错误代码为%1
    查看>>
    Python3.7安装cv2踩过的坑
    查看>>
    python写txt文件
    查看>>
    python关于sorted排序函数详细解析 附实战代码(全)
    查看>>
    python3.8调用m文件,调用matlab
    查看>>
    python3.9新特性_Python 3.9 新特性速览
    查看>>
    Python3.x:遍历select下拉框获取value值
    查看>>