当前位置: 首页 > 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.lryc.cn/news/594781.html

相关文章:

  • 从安装到上手:Ubuntu 22.04 玩转 Containerd 2.1.3 容器运行时
  • 在 Windows上用WSL和VSCode进行Linux开发环境配置
  • 《使用 IDEA 部署 Docker 应用指南》
  • 在Anolis8.6上源码编译安装部署OpenVAS(GVM)未完待续
  • git bash命令不够完善,想整合msys2该怎么办?
  • Dynamics 365 Contact Center是什么
  • Java 解析前端上传 ZIP 压缩包内 Excel 文件的完整实现方案
  • 前端开发者快速理解Spring Boot项目指南
  • 在 Angular 应用程序中使用 Genkit 的完整指南
  • docker 容器学习
  • Three.js 全景图(Equirectangular Texture)教程:从加载到球面映射
  • AR技术:应急响应的加速利器
  • AR技术:石化行业培训的“游戏规则改变者”
  • Web开发:ABP框架12——中间件Middleware的创建和使用
  • AR巡检和传统巡检的区别
  • CCLink IE转ModbusTCP网关与三菱PLC通讯无纸记录器
  • uni-app开发小程序,根据图片提取主题色值
  • 网络编程基础:从 OSI 模型到 TCP/IP 协议族的全面解析
  • Android 中 SystemServiceManager 和 ServiceManager 的应用场景、区别与联系
  • 漏洞扫描 + 渗透测试:双轮驱动筑牢网络安全防线
  • Ubuntu 22.04 使用 Docker 安装 Redis 5 (安装包形式)
  • 内网与外网是通过什么进行传输的?内外网文件传输的安全方法
  • C#最佳实践:为何应尽量减少静态类的使用
  • 迅为八核高算力RK3576开发板摄像头实时推理测试 RetinaFace人脸检测
  • Curtain e-locker 易锁防泄密:无需网络隔离,实现安全与效率并存
  • 大腾智能国产3D CAD软件正式上架华为云云商店
  • 进程资源分配的安全性判断与安全序列
  • ZooKeeper学习专栏(四):单机模式部署与基础操作详解
  • 【c++】leetcode5 最长回文子串
  • 突破量子仿真瓶颈:微算法科技MLGO量子算法的算术化与核操作迭代模型