博客
关于我
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/

    你可能感兴趣的文章
    Python再获年度编程语言,微软或成最大赢家
    查看>>
    python-week5
    查看>>
    Python写表情包搜索工具(非常详细)零基础入门到精通,收藏这一篇就够了
    查看>>
    Python-【1】配置
    查看>>
    Python-从子文件夹执行绝对导入
    查看>>
    Python-刷新页面,直到元素可单击
    查看>>
    PYTHON-唤醒+VOSK+DEEPSEEK+离线合成-实现纯离线大模型问答
    查看>>
    Python-在Dash回调中重用函数
    查看>>
    PYTHON-基本数据类型-元祖类型,字典类型,集合类型
    查看>>
    python-外观模式
    查看>>
    Python-如何使用FastAPI和uvicorn.run而不阻塞线程?
    查看>>
    Python-字典
    查看>>
    python-字符串
    查看>>
    Python-将二进制遮罩转换为多边形
    查看>>
    python-文件操作
    查看>>
    PYTHON-模块 sys os random shutil-练习
    查看>>
    Python-模块与包的管理
    查看>>
    PYTHON-模块定义 搜索路径
    查看>>
    Python-爬虫工程师-面试总结
    查看>>
    Python-类与文件读取结合
    查看>>