首页 > 其他分享 >设计模式学习(二)工厂模式——抽象工厂模式+注册表

设计模式学习(二)工厂模式——抽象工厂模式+注册表

时间:2024-07-09 20:18:55浏览次数:16  
标签:return name 工厂 camera 注册表 设计模式 os

目录

前言

上一篇文章中我们提到了抽象工厂模式初版代码的一些缺点:①客户端违反开闭原则②提供方违反开闭原则。本文将针对这两点进行讨论

使用简单工厂改进

对于缺点①,我们可以使用简单工厂的思路来改进抽象工厂的初版代码。对于上一篇文章中的例子,我们去除CameraFactoryBaslerCameraFactorySickCameraFactory,取而代之的是SimpleFactory类。

类图如下:

代码如下:

//工厂类
class SimpleFactory
{
public:
    BaslerCamera* CreateBaslerCamera()
    {
        if ("Linux" == os_name_)
        {
            return new LinuxBaslerCamera();
        }
        else if ("Windows" == os_name_)
        {
            return new WindowsBaslerCamera();
        }
        else
        {
            return nullptr;
        }
    }

    SickCamera* CreateSickCamera()
    {
        if ("Linux" == os_name_)
        {
            return new LinuxSickCamera();
        }
        else if ("Windows" == os_name_)
        {
            return new WindowsSickCamera();
        }
        else
        {
            return nullptr;
        }
    }
public:
    std::string os_name_ = "Linux";

};

//客户端
int main()
{
    SimpleFactory* camera_factory = new SimpleFactory();
   
    BaslerCamera* basler_camera = camera_factory->CreateBaslerCamera();
    basler_camera->OpenCamera();

    SickCamera* sick_camera = camera_factory->CreateSickCamera();
    sick_camera->OpenCamera();

    return 0;
}

注意,上述方法虽然改进了缺点①,但是缺点②仍存在。

使用注册表改进

对于缺点②,其本质是:增加新产品时,对工厂类带来的修改违反了开闭原则。对于这种情况,我们可以参考《设计模式学习(二)工厂模式——工厂方法模式+注册表》中提到的注册表,来去除switchif这种分支判断,解除分支判断带来的耦合。

对于具体产品,我们可以这样将它注册:

class LinuxBaslerCamera : public BaslerCamera
{
public:
    ~LinuxBaslerCamera() override = default;
    bool OpenCamera() override
    {
        return true;
    }
};

ReflectRegister("LinuxBasler", LinuxBaslerCamera);

然后工厂类的代码可以简化为:

class SimpleFactory
{
public:
    BaslerCamera* CreateBaslerCamera()
    {
        std::string name = os_name_ + "Basler";
        return Object::CreateObject<BaslerCamera>(name);
    }

    SickCamera* CreateSickCamera()
    {
        std::string name = os_name_ + "Sick";
        return Object::CreateObject<SickCamera>(name);
    }
public:
    std::string os_name_ = "Linux";
};

这样,在产品族增加时(比如增加一个HarmonyOS),我们只需要在它下面的产品类对应的文件中使用ReflectRegister注册,然后改变os_name_即可(当然os_name_也可以在运行时从配置文件中加载,这样更好)。

而对于现有的产品族内增加新产品(比如增加一个Huaray相机),工厂类中还是要增加一个CreateHuarayCamera函数。

参考文章

1.《大话设计模式》

标签:return,name,工厂,camera,注册表,设计模式,os
From: https://www.cnblogs.com/paw5zx/p/18292689

相关文章

  • 运维锅总详解设计模式
    本首先简介23种设计模式,然后用Go语言实现这23种设计模式进行举例分析。希望对您理解这些设计模式有所帮助!一、设计模式简介设计模式是软件设计中用于解决常见设计问题的一套最佳实践。它们不是代码片段,而是解决特定问题的通用方案。设计模式分为三大类:创建型模式、结构型......
  • 设计模式之工厂模式
    1.前言最近在看《大话设计模式》这本书,虽然大学也学过设计模式,但是那时候还没有进行过开发,那么多的设计模式,看了也不知道用在哪种场景,最近又突然有时间了,就想着重新理解一遍软件的设计模式,本篇博客的原地址为runoob2.工厂模式的简介工厂模式(FactoryPattern)是Java中最常用的......
  • 设计模式之策略模式和工厂模式的区别
    1.前言本篇博客转载于策略模式与工厂模式比较2.区别这段时间看了一些设计模式,看到策略模式与工厂模式的时候,总是感觉他们很相似,不要区分,到具体的场景了你可能还在徘徊到底用工厂还是策略呢?这几天就想写一篇关于策略模式与工厂模式区别的文章,但一直没思路,昨天跟淘宝mm聊了聊,今天......
  • powershell获取更多关于 Windows 操作系统的详细信息,可以考虑扩展脚本来获取其他属性
    powershell获取更多关于Windows操作系统的详细信息,可以考虑扩展脚本来获取其他属性。例如,你可以使用以下脚本来获取更多注册表键值的信息:powershellCopyCode#获取更多关于WindowsNT的信息Get-ItemProperty-Path"HKLM:\SOFTWARE\Microsoft\WindowsNT\CurrentVersion"......
  • 设计模式六大原则
    一、单一职责原则(SingleResponsibilityPrinciple)定义:一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。问题由来:类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2......
  • [JS]设计模式
    介绍设计模式就是在面向对象软件设计过程中,针对特定问题的简洁而优雅的解决方案目前说到设计模式,一般指<设计模式:可复用面向对象软件的基础>一书中提到的23种常见软件设计模式工厂模式在JavaScript中,工厂模式的表现形式就是一个调用即可返回新对象的函数<scri......
  • 在计算机取证中,Volatility 是一个流行的开源内存取证工具,专门用于分析内存镜像以发现
    在计算机取证中,Volatility是一个流行的开源内存取证工具,专门用于分析内存镜像以发现系统运行时的信息。它提供了丰富的功能和插件,用于检测和分析操作系统中的各种活动,包括进程、网络连接、注册表、文件系统等。下面是一些Volatility的基本特点和使用场景:主要特点:多平台支持......
  • 智慧安防/智慧工厂/视频分析EasyCVR视频监控汇聚平台如何关闭国标设备的自动检索功能?
    安防监控视频融合汇聚平台EasyCVR兼容性强,可支持Windows系统、Linux系统以及国产化操作系统等,平台既具备传统安防视频监控的能力,也具备接入AI智能分析的能力,可拓展性强、视频能力灵活,能对外分发RTMP、RTSP、HTTP-FLV、WebSocket-FLV、HLS、WebRTC、ws-fmp4、http-fmp4等视频流。......
  • JAVA设计模式>>单例模式
    本文介绍23中设计模式中的单例模式         这篇文章详解四个知识点:单例模式的概念,单例设计模式八种方式,单例模式在JDK应用的源码分析,单例模式注意事项和细节说明单例设计模式1.1概述        所谓类的单例设计模式,就是采取一定的方法保证在整个的软......
  • 智能工厂数据可视化
     ......