【C++ | 设计模式】简单工厂模式的详解与实现

news2024/9/23 11:28:02

1.简单工厂模式概述

简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它定义了一个工厂类,由这个类根据提供的参数决定创建哪种具体的产品对象。简单工厂模式将对象的创建逻辑集中到一个工厂类中,从而将对象的创建与对象的使用分离。

2.模式结构

UML 结构图:

  • 核心概念

  • 工厂类(Factory):负责根据不同的输入参数创建不同的产品对象。工厂类通常有一个方法,这个方法根据传入的参数返回不同类型的产品对象。
  • 产品类(Product):被创建的对象,这些对象通常有一个共同的接口或抽象基类。不同的产品类实现了这个接口或继承了这个基类。
  • 客户端(Client):使用工厂类来获取产品对象。客户端不直接创建产品,而是通过工厂类来获取产品对象。

简单工厂模式的工作流程

  1. 客户端工厂类提交产品需求,传递参数给工厂类。
  2. 工厂类根据参数决定创建哪种产品对象
  3. 工厂类创建产品对象,并将其返回给客户端
  4. 客户端使用获得的产品对象。

3.优缺点

优点:

  • 工厂类包含了必要的逻辑判断,根据指定的信息来创建对应的产品。客户端仅负责“消费”产品即可,实现了对象创建和使用的分离

  • 客户端无需关心具体产品如何创建与组织,仅需知道具体产品所对应的参数即可,可以在一定程度减少使用者的记忆量。

缺点:

  • 由于工厂类集中了所有产品的创建逻辑(违反了高内聚责任分配原则),职责过重,一旦无法正常工作,整个系统都将受到影响。

  • 一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。 这些缺点在 C++工厂方法模式 中得到了一定的克服。

4.适用场景

  • 工厂类负责创建的对象比较少(不会造成工厂方法中的业务逻辑太过复杂)。

  • 客户端仅需知道传入工厂类的参数,对于如何创建对象(逻辑)不关心。 PS: 由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。

5.案例分析

BBA - 奔驰、宝马、奥迪

互联网行业有三巨头 BAT,汽车界也有三大豪门 BBA - 奔驰、宝马、奥迪。他们是驰名世界的汽车企业,也被认为是高档汽车生产的先导,最可怕的是均属于德国制造。奔驰优雅稳重、宝马操控感强、奥迪大气,更是官车的代表。。。“坐奔驰,开宝马”,足以说明一切。在国内,BBA 大受欢迎,对很多人来说,不仅是代步工具,更是身份的象征。

车再好,也需要在工厂中加工生产,来一起看看简单工厂模式吧!

示例代码:

#include <iostream>
#include <string>

// 产品接口
class Car {
public:
    virtual void describe() const = 0;  // 纯虚函数,描述汽车
    virtual ~Car() = default;           // 虚析构函数,确保派生类的析构函数被调用
};

// 具体产品类 - 奔驰
class Benz : public Car {
public:
    void describe() const override {
        std::cout << "This is a Benz: Elegant and prestigious." << std::endl;
    }
};

// 具体产品类 - 宝马
class BMW : public Car {
public:
    void describe() const override {
        std::cout << "This is a BMW: Strong handling and dynamic driving experience." << std::endl;
    }
};

// 具体产品类 - 奥迪
class Audi : public Car {
public:
    void describe() const override {
        std::cout << "This is an Audi: Stylish and high-tech." << std::endl;
    }
};

// 工厂类
class CarFactory {
public:
    // 静态方法,根据品牌类型创建具体的汽车对象
    static Car* createCar(const std::string& brand) {
        if (brand == "Benz") {
            return new Benz();
        } else if (brand == "BMW") {
            return new BMW();
        } else if (brand == "Audi") {
            return new Audi();
        } else {
            return nullptr;  // 返回空指针,表示无效的品牌
        }
    }
};

int main() {
    // 使用工厂类创建具体汽车对象
    Car* benz = CarFactory::createCar("Benz");
    if (benz) {
        benz->describe();
        delete benz;  // 手动释放内存
    }

    Car* bmw = CarFactory::createCar("BMW");
    if (bmw) {
        bmw->describe();
        delete bmw;  // 手动释放内存
    }

    Car* audi = CarFactory::createCar("Audi");
    if (audi) {
        audi->describe();
        delete audi;  // 手动释放内存
    }

    // 测试无效品牌
    Car* unknown = CarFactory::createCar("Unknown");
    if (!unknown) {
        std::cout << "Unknown car brand" << std::endl;
    }

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2094035.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

认知杂谈32

今天分享 有人说的一段争议性的话 I I 《恋爱中的价值难题》 咱就认识个31岁的哥们&#xff0c;事业有成&#xff0c;一年能挣35 万。他现在正为找对象的事儿犯愁呢。他想找个年轻漂亮的小姑娘谈对象&#xff0c;可又不想在感情上投入太多&#xff0c;就想一边乐呵着&#x…

Linux(CentOS)同步服务器时间之~ntpd

NTP 是 Network Time Protocol&#xff08;网络时间协议&#xff09;的缩写&#xff0c;它是一种用于在计算机系统之间同步时间的协议。NTP 允许网络中的设备通过与一个或多个时间服务器进行通信&#xff0c;来校正自身的系统时钟&#xff0c;确保所有设备上的时间保持高度一致…

演示:基于WPF的DrawingVisual和谷歌地图瓦片开发的地图(完全独立不依赖第三方库)

一、目的&#xff1a;基于WPF的DrawingVisual和谷歌地图瓦片开发的地图 二、预览 三、环境 VS2022&#xff0c;Net7,DrawingVisual&#xff0c;谷歌地图瓦片 四、主要功能 地图缩放&#xff0c;平移&#xff0c;定位 真实经纬度 显示瓦片信息 显示真实经纬度和经纬线 省市县…

[环境配置]Pycharm手动安装汉化插件

在Pycharm-file-setting-Plugins中&#xff0c;搜索chinese&#xff0c;就会出现汉化包 点击install后&#xff0c;在安装时出现这种报错&#xff1a;Plugin "Chinese (Simplified) Language Pack / 中文语言包" was not installed: Invalid filename returned by a …

用 jsPDF 让 PDF 生成触手可及

jsPDF &#xff1a;在浏览器中生成 PDF&#xff0c;从未如此简单- 精选真开源&#xff0c;释放新价值。 概览 jsPDF 是一个开源的 JavaScript 库&#xff0c;专为在浏览器端生成 PDF 文档而设计。它通过提供一个直观且易于使用的 API&#xff0c;使得开发者能够快速地将 PDF 生…

【Kubernetes】持久卷 PV

持久卷 PV 1.什么是持久卷2.创建一个持久卷3.持久卷的访问模式4.持久卷的回收策略 数据卷是在创建 Pod 时通过 挂载目录 来实现数据的共享和持久化的。但是在一个大型系统中&#xff0c;这种方式是非常不利于管理的&#xff0c;因为数据卷把数据的 持久存储 和 供应使用 封装在…

短时傅里叶变换(Short-Time Fourier Transform, STFT),语音识别

高能预警&#xff01;&#xff01;&#xff01; .wav文件为笔者亲自一展歌喉录制的噪声&#xff0c;在家中播放&#xff0c;可驱赶耗子&#xff0c;蟑螂 介绍 短时傅里叶变换&#xff08;Short-Time Fourier Transform, STFT&#xff09;是一种时频分析方法&#xff0c;用于…

智能分拣投递机器人

产品介绍 自研智能分拣投递机器人&#xff0c;专注于物流行业“NC小件”的分拣与投递&#xff0c;机器人运行稳定、分拣效率高&#xff0c;搭配智能分拣投递系统单台机器人最大作业效率可达400件/H&#xff0c;投递效率相较于传统“小黄人“提升了30%-50%&#xff0c;可替代“…

生成艺术,作品鉴赏:物似主人形

2001年&#xff0c;当21岁的我&#xff0c;还在恒基伟业当高级工程师时。我有一个女同事&#xff0c;她有个特别大的杯子用来喝水&#xff0c;不夸张的说&#xff0c;是那种我从来没见过的大杯子&#xff0c;由于她是很大只的那种&#xff0c;她便自嘲说&#xff1a;「物似主人…

RAG增强的视觉问答开发框架

检索增强生成 (RAG) 是一种强大的技术&#xff0c;可以提高大型语言模型 (LLM) 生成的答案的准确性和可靠性。它还提供了检查模型在特定生成过程中使用的源的可能性&#xff0c;从而使人类用户更容易进行事实核查。此外&#xff0c;RAG 可以使模型知识保持最新状态并整合特定主…

前端进阶| 深入学习面向对象设计原则

引言 面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;是一种常用的编程范式&#xff0c;它通过将数据和与之相关的操作封装在一起&#xff0c;提供了一种更有组织和易于理解的方式来构建应用程序。在JavaScript中&#xff0c;我们可以使用面…

【持续更新】【Google Play版】淘宝最新国际版10.36.10.20启动更快

功能和国内比基本是差不多的&#xff0c;只不过没有应用内乱七八糟的弹窗&#xff0c;用起来比较舒服&#xff0c;启动也比较快。 像这种软件如何保证是 官方 的呢&#xff1f;毕竟涉及到财产&#xff0c;还是要小心些的。 很简单&#xff0c;修改过的 app 会提示“签名不一致…

Unity本地化id查找器,luaparser函数参数查找

前言&#xff1a; 适用范围&#xff1a;Unity 中需要查找所有预制体里面的某一个脚本的属性值&#xff0c;或者Lua脚本里面的某一个属性值 本文介绍如何查找预制体和Lua脚本里面调用的本地化id 下面首先介绍改插件的功能以及使用方法&#xff0c;然后对该插件的原理进行说明 使…

SOMEIP_ETS_075: Wrong_Message_Type

测试目的&#xff1a; 验证当设备&#xff08;DUT&#xff09;接收到一个包含错误消息类型的SOME/IP请求时&#xff0c;是否能够返回错误消息或忽略该请求。 描述 本测试用例旨在检查DUT在处理一个echoUINT8方法的SOME/IP消息时&#xff0c;如果消息中包含的消息类型不正确&…

【超详细】Linux开发环境搭建指南 | Ubuntu

文章目录 虚拟机安装对比Virtual Box 下载ubuntu 操作系统下载Virtual Box 安装安装ubuntu设置中文语言共享文件夹设置添加输入法安装步骤&#xff0c;参考官方教程 安装 vscode解决主机不能通过ssh连接宿主机网络连接几种网络连接区别主机和宿主机相互 ping通 网络代理 虚拟机…

为k8s准备docker 私有仓库 harbor

目录 一、 环境准备 二、部署docker 二、为Registry提加密传输 三、为仓库建立登陆认证 四、构建harbor 五、上传镜像 然后就是在200上面进行配置了 一、 环境准备 我是用两台虚拟机(红帽9)的&#xff0c;一台172.25.254.10用来部署加密认证仓库&#xff0c;另一台172.2…

从零上手CV竞赛:YOLO方案 # Datawhale AI夏令营

文章目录 平台参赛平台云平台 Task 1 从零上手CV竞赛下载baseline相关文件一键运行baseline&#xff01;&#xff08;大约需要25分钟&#xff09;赛题解析数据集提交结果违法标准注意事项 下载生成的文件结果如图最后要记得关机 不然一直消耗算力 Task 2 建模方案解读与进阶物体…

【大数据算法】时间亚线性算法之:串相等判定算法。

串相等判定算法 1、引言2、串相等判定算法2.1 定义2.2 核心原理2.3 应用场景2.4 算法公式2.4.1 Rabin-Karp算法2.4.2 哈希函数 2.5 代码示例 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c; 啥是串相等判定算法啊 小鱼&#xff1a;这个… en…en… 小屌丝&#xff1a;咋…

ai免费生成ppt软件有哪些?我推荐秒出PPT

现在市面上的ai生成PPT软件非常的多。有收费的&#xff0c;也有不收费的&#xff0c;生成的效果也各不相同。要选择一个性价比高的确实难度不小。 我在使用了不少的产品之后&#xff0c;说一说我的心得。 首先就是&#xff0c;大部分免费的ai生成ppt产品并不好用。我怕不排除…

解决Selenium已安装,在pycharm导入时报错

搭建设selenium环境时&#xff0c;selenium已安装&#xff0c;但是在pycharm中使用“from selenium import webdriver”语句时红线报错 解决方案&#xff1a; 1.file->settings进入设置 2.点击加号&#xff0c;搜索‘selenium’安装 3&#xff0c;等待安装完成&#xff0…