博客
关于我
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中的方法_Python中看起来高大上的技术
    查看>>
    PYTHON中的测地距离变换
    查看>>
    Python中的私有方法
    查看>>
    Python中的空元组是“常量“吗?
    查看>>
    Python中的类-ChatGPT4o作答
    查看>>
    Python中的类中的池
    查看>>
    python中的装饰器基础
    查看>>
    python中的负零
    查看>>
    Python中的进程通信
    查看>>
    Python中的递归有多安全?
    查看>>
    python中程序如何获取实现多行输入
    查看>>
    python中算法与数学_中国古代数学算法的Python实现
    查看>>
    python中类的实例化_python类的实例化
    查看>>
    Python中类的约束
    查看>>
    python中自定义sort 规则
    查看>>
    python中自定义错误_在现代Python中声明自定义异常的正确方法?
    查看>>
    python中获取上一个月一号的方法
    查看>>
    python中蜂窝网格边缘的坐标
    查看>>
    Python中表示偶数_分享一组 Python 高效编程的实用技巧
    查看>>