当前位置: 首页 > news >正文

设计模式六:工厂模式(Factory Pattern)

概念

  • 定义一个创建对象的接口,但让子类决定实例化哪个类。

    实现示例

    #include <iostream>
    #include <memory>// 产品基类
    class Product {
    public:virtual void use() = 0;virtual ~Product() = default;
    };// 具体产品A
    class ConcreteProductA : public Product {
    public:void use() override {std::cout << "Using Product A" << std::endl;}
    };// 具体产品B
    class ConcreteProductB : public Product {
    public:void use() override {std::cout << "Using Product B" << std::endl;}
    };// 工厂基类
    class Factory {
    public:virtual std::unique_ptr<Product> createProduct() = 0;virtual ~Factory() = default;
    };// 具体工厂A
    class ConcreteFactoryA : public Factory {
    public:std::unique_ptr<Product> createProduct() override {return std::make_unique<ConcreteProductA>();}
    };// 具体工厂B
    class ConcreteFactoryB : public Factory {
    public:std::unique_ptr<Product> createProduct() override {return std::make_unique<ConcreteProductB>();}
    };// 使用示例
    int main() {std::unique_ptr<Factory> factoryA = std::make_unique<ConcreteFactoryA>();auto productA = factoryA->createProduct();productA->use(); // Using Product Astd::unique_ptr<Factory> factoryB = std::make_unique<ConcreteFactoryB>();auto productB = factoryB->createProduct();productB->use(); // Using Product Breturn 0;
    }

UML结构图

 

  • 优缺点

  • 优点:符合开闭原则,扩展性好

  • 缺点:每增加一个产品就要增加一个工厂类

要点总结  

1、FactoryMethod模式用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系(new)会导致软件的脆弱。
2、FactoryMethod模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好地解决了这种紧耦合关系。
3、FactoryMethod模式解决“单个对象”的需求变化。缺点在于要求创建方法/参数相同。

http://www.dtcms.com/a/291271.html

相关文章:

  • C语言:20250721笔记
  • 在 Conda 中删除环境及所有安装的库
  • 《使用 IDEA 部署 Docker 应用指南》
  • Linux-rpm和yum
  • Shell脚本编程:从入门到精通的实战指南
  • 从零开始:用Python库轻松搭建智能AI代理
  • Djoser 详解
  • 深度学习中的数据增强:从理论到实践
  • hot100回归复习(算法总结1-38)
  • 力扣面试150(35/150)
  • 【安全篇 / 反病毒】(7.6) ❀ 01. 查杀HTTPS加密网站病毒 ❀ FortiGate 防火墙
  • Excel函数 —— XLOOKUP 双向查找
  • Linux find命令:强大的文件搜索工具
  • 计算机发展史:电子管时代的辉煌与局限
  • 无人机浆叶安装顺序
  • 【算法基础】二分查找
  • 源码编译安装boost库,以及卸载boost库
  • 插值法的使用
  • Js进阶案例合集
  • iostat的使用说明
  • 基于深度学习的图像分类:使用ResNet实现高效分类
  • (10)机器学习小白入门 YOLOv:YOLOv8-cls 模型评估实操
  • G7打卡——Semi-Supervised GAN
  • numpy库的基础知识
  • 【VASP】机器学习势概述
  • 5G/4G PHY SoC:RNS802,适用于集成和分解的小型蜂窝 RAN 架构。
  • 在github上搭建自己主页
  • Blender软件入门-了解软件界面
  • JS逆向 - 滴滴(dd03、dd05)WSGSIG
  • Webpack源代码泄露漏洞