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

设计模式之工厂模式的优缺点

工厂模式是一种创建对象的设计模式,它将对象的创建和使用分离。以下是工厂模式的优缺点:
 
优点
 
- 解耦对象的创建和使用:使得代码的依赖关系更加清晰,使用者不需要了解对象的具体创建过程,只需要关心如何使用对象,降低了代码的耦合度。
 
- 提高可维护性和可扩展性:当需要创建新的对象或者修改对象的创建逻辑时,只需要在工厂类中进行修改,而不需要在所有使用该对象的地方进行修改,便于代码的维护和扩展。
 
- 便于代码复用:工厂类可以被多个地方复用,提高了代码的复用性。
 
缺点
 
- 增加了代码复杂度:引入了工厂类,使得代码结构变得更加复杂,对于简单的对象创建场景,可能会显得过于繁琐。
 
- 不符合开闭原则:当需要增加新的产品对象时,虽然可以在不修改已有代码的情况下进行扩展,但是需要修改工厂类的创建逻辑,违反了开闭原则的“对修改关闭”原则。
 
- 工厂类可能会过于庞大:随着产品对象的不断增加,工厂类中的创建逻辑可能会变得非常复杂,导致工厂类难以维护。

以下是一个使用C++实现的工厂模式的简单代码示例,以创建不同类型的动物(猫和狗)为例:
 
cpp   
#include <iostream>
#include <string>
using namespace std;

// 动物基类
class Animal {
public:
    virtual void speak() = 0;
    virtual ~Animal() {}
};

// 猫类,继承自动物基类
class Cat : public Animal {
public:
    void speak() override {
        cout << "喵~喵~" << endl;
    }
};

// 狗类,继承自动物基类
class Dog : public Animal {
public:
    void speak() override {
        cout << "汪~汪~" << endl;
    }
};

// 动物工厂类
class AnimalFactory {
public:
    static Animal* createAnimal(const string& animalType) {
        if (animalType == "cat") {
            return new Cat();
        } else if (animalType == "dog") {
            return new Dog();
        }
        return nullptr;
    }
};

int main() {
    Animal* cat = AnimalFactory::createAnimal("cat");
    if (cat) {
        cat->speak();
        delete cat;
    }

    Animal* dog = AnimalFactory::createAnimal("dog");
    if (dog) {
        dog->speak();
        delete dog;
    }

    return 0;
}
 
 
在上述代码中:
 
1. 首先定义了抽象的  Animal  基类,其中包含一个纯虚函数  speak ,用于表示动物发出声音的行为。
 
2. 然后创建了具体的  Cat  类和  Dog  类,它们都继承自  Animal  基类,并实现了  speak  函数。
 
3.  AnimalFactory  是工厂类,它有一个静态函数  createAnimal ,根据传入的字符串参数("cat" 或 "dog")来创建相应的动物对象。
 
4. 在  main  函数中,通过调用  AnimalFactory  的  createAnimal  函数来获取动物对象,并调用其  speak  函数,最后记得释放动态分配的内存。

相关文章:

设计模式之工厂模式的优缺点

工厂模式是一种创建对象的设计模式&#xff0c;它将对象的创建和使用分离。以下是工厂模式的优缺点&#xff1a; 优点 - 解耦对象的创建和使用&#xff1a;使得代码的依赖关系更加清晰&#xff0c;使用者不需要了解对象的具体创建过程&#xff0c;只需要关心如何使用对象&a…...

CCBCISCN复盘

AWDP – ccfrum 自己搭了一下环境, 复现一下这道题目, 之前比赛的时候完全没想到这个漏洞要怎么打, 修也不知道要怎么修, 就仅仅是对用户名的账号和密码进行了一下过滤, 完全没起到作用, 唉, 实在太菜 如果想要尝试复现的话可以尝试拉取这个镜像, 我打完之后就直接把这个容器给…...

糊涂人寄信——递推

思路分析&#xff1a;当有n封信&#xff0c;n个信封时。第k封信没有装在第k个信封里&#xff08;k从1~n&#xff09;&#xff0c;就算所有的信封都装错了。我们可以得知的是&#xff0c;当有1封信,时&#xff0c;装错类别数为0。当有两封信时&#xff0c;装错类别为1。 当有三…...

OpenHarmony子系统开发 - 电源管理(一)

OpenHarmony子系统开发 - 电源管理&#xff08;一&#xff09; 一、电源模式定制开发指导 概述 简介 OpenHarmony默认提供了电源模式&#xff08;如正常模式、性能模式、省电模式、超级省电模式&#xff09;的特性。但由于不同产品的部件存在差异&#xff0c;导致在同样场景…...

使用 OpenCV 拼接进行图像处理对比:以形态学操作为例

图像处理在计算机视觉中起着至关重要的作用&#xff0c;而 OpenCV 作为一个强大的图像处理库&#xff0c;提供了丰富的函数来实现各类图像处理任务。形态学操作&#xff08;Morphological Operations&#xff09;是其中常用的技术&#xff0c;尤其适用于二值图像的处理。常见的…...

数据库的左连接,右连接,全外连接,自连接,内连接的区别

从语法层面上看&#xff0c; 全外连接full outer join 左连接是left outer join 右连接是right outer join 内连接是inner join 自连接是自身表与自身表进行的左右连接&#xff0c;需要注意的是并没有左内连接和右内连接。 左外连接 select * from A left outer join B …...

Nexus L2 L3基本配置

接口基本配置 N7K上所有端口默认处于shutdown状态; N5K上所有端口默认处于no shutdown状态(所有端口都是switchport) 默认所有接口都是三层route模式, 只有当线卡不支持三层的时候, 接口才会处于二层switchport模式 show run all | in “system default” 创建SVI口需要提前打…...

OpenHarmony 入门——ArkUI 跨页面数据同步和页面级UI状态存储LocalStorage小结(二)

文章大纲 引言一、在代码逻辑使用LocalStorage二、从UI内部使用LocalStorage三、LocalStorageProp和LocalStorage单向同步四、LocalStorageLink和LocalStorage双向同步五、兄弟组件之间同步状态变量七、将LocalStorage实例从UIAbility共享到一个或多个视图 引言 前面一篇文章主…...

Python数据可视化实战:从基础图表到高级分析

Python数据可视化实战&#xff1a;从基础图表到高级分析 数据可视化是数据分析的重要环节&#xff0c;通过直观的图表可以快速洞察数据规律。本文将通过5个实际案例&#xff0c;手把手教你使用Python的Matplotlib库完成各类数据可视化任务&#xff0c;涵盖条形图、堆积面积图、…...

在 Elasticsearch 中扩展后期交互模型 - 第 2 部分 - 8.18

作者&#xff1a;来自 Elastic Peter Straer 及 Benjamin Trent 本文探讨了如何优化后期交互向量&#xff0c;以适应大规模生产工作负载&#xff0c;例如减少磁盘空间占用和提高计算效率。 在之前关于 ColPali 的博客中&#xff0c;我们探讨了如何使用 Elasticsearch 创建视觉搜…...

蓝桥每日打卡--区间移位

#蓝桥#JAVA#区间移位 题目描述 数轴上有n个闭区间&#xff1a;D1,⋯Dn。 其中区间Di用一对整数[ai,bi]来描述&#xff0c;满足 ai≤bi。 已知这些区间的长度之和至少有。 所以&#xff0c;通过适当的移动这些区间&#xff0c;你总可以使得他们的"并"覆盖 [0,],也…...

CUDAOpenCV 基于Hessian矩阵计算特征值

文章目录 一、简介二、实现代码三、实现效果一、简介 基于之前的博客:CUDA&OpenCV Hessain矩阵计算,我们可以计算出每个像素的特征值: 二、实现代码 ComputeHessainMatrix.cuh #ifndef HESSAIN_GPU_CUH #...

基于CAMEL 的Workforce 实现多智能体协同工作系统

文章目录 一、workforce 简介1.架构设计2.通信机制 二、workforce 工作流程图示例1.用户角色2.工作流程 三、workforce 中重要函数说明1.__init__函数2.add_single_agent_worker 函数3.add_role_playing_worker 函数4.add_workforce 函数 四、基于workforce实现多智能体协调&am…...

深入探讨 `ip2region` 中三种初始化方法:newWithBuffer、newWithVectorIndex 和 newWithFileOnly

在处理IP地址地理位置定位时&#xff0c;ip2region 提供了多种方式来初始化 Searcher 实例&#xff0c;以适应不同的应用场景和资源限制。本文将详细介绍并对比 newWithBuffer、newWithVectorIndex 和 newWithFileOnly 这三种初始化方法&#xff0c;帮助开发者根据自己的需求选…...

PostgreSQL_数据表结构设计并创建

目录 前置&#xff1a; 1 数据表设计思路 2 数据表格SQL 3 创建 3.1 创建数据库 db_stock 3.2 在 pgAdmin4 中创建表 前置&#xff1a; 本博文是一个系列。在本人“数据库专栏”-》“PostgreSQL_”开头的博文 1 数据表设计思路 1 日数据来自优矿&#xff0c;优矿的数据…...

如何在MCU工程中启用HardFault硬错误中断

文章目录 一、HardFault出现场景二、启动HardFault三、C代码示例 一、HardFault出现场景 HardFault&#xff08;硬故障&#xff09; 错误中断是 ARM Cortex-M 系列微控制器中一个较为严重的错误中断&#xff0c;一旦触发&#xff0c;表明系统遇到了无法由其他异常处理机制解决…...

MySQL -- 复合查询

数据库的查询是数据库使用中比较重要的环节&#xff0c;前面的基础查询比较简单&#xff0c;不做介绍&#xff0c;可自行查阅。本文主要介绍复合查询&#xff0c;并结合用例进行讲解。 本文的用例依据Soctt模式的经典测试表&#xff0c;可以自行下载&#xff0c;也可以自己创建…...

@EnableWebMvc注解导致的坑-记录

1.添加了EnableWebMvc&#xff0c;需要手动添加相关配置&#xff0c;swagger页面问题&#xff0c;出现Unable to render this definition The provided definition does not specify a valid version field. Please indicate a valid Swagger or OpenAPI version field. Suppor…...

卷积神经网络 - 卷积层(具体例子)

为了更一步学习卷积神经网络之卷积层&#xff0c;本文我们来通过几个个例子来加深理解。 一、灰度图像和彩色图像的关于特征映射的例子 下面我们通过2个例子来形象说明卷积层中“特征映射”的概念&#xff0c;一个针对灰度图像&#xff0c;一个针对彩色图像。 例子 1&#x…...

测试Claude3.7 sonnet画蛋白质

测试Claude3.7 sonnet画蛋白虽然画的很粗糙&#xff0c;但是大致画了出来...

java项目之基于ssm的游戏攻略网站(源码+文档)

项目简介 游戏攻略网站实现了以下功能&#xff1a; 管理员主要负责填充图书和其类别信息&#xff0c;并对已填充的数据进行维护&#xff0c;包括修改与删除&#xff0c;管理员也需要审核老师注册信息&#xff0c;发布公告信息&#xff0c;管理自助租房信息等。 &#x1f495;…...

本地基于Ollama部署的DeepSeek详细接口文档说明

前文&#xff0c;我们已经在本地基于Ollama部署好了DeepSeek大模型&#xff0c;并且已经告知过如何查看本地的API。为了避免网络安全问题&#xff0c;我们希望已经在本地调优的模型&#xff0c;能够嵌入到在本地的其他应用程序中&#xff0c;发挥本地DeepSeek的作用。因此需要知…...

python NameError报错之导库报错

在日常代码编写中&#xff0c;经常出现如 图1 一样的报错&#xff0c;在代码多时很难找到问题&#xff0c;但翻看代码后就会发现是因为未导库&#xff0c; 图1 报错 代码: time.sleep(0.1) print("time库") 解决方法: 第一步:在代码中添加导库代码 import time #…...

Web3网络生态中数据保护合规性分析

Web3网络生态中数据保护合规性分析 在这个信息爆炸的时代&#xff0c;Web3网络生态以其独特的去中心化特性&#xff0c;逐渐成为数据交互和价值转移的新平台。Web3&#xff0c;也被称为去中心化互联网&#xff0c;其核心理念是将数据的控制权归还给用户&#xff0c;实现数据的…...

【数学建模】模糊综合评价模型详解、模糊集合论简介

模糊综合评价模型详解 文章目录 模糊综合评价模型详解1. 模糊综合评价模型概述2. 模糊综合评价的基本原理2.1 基本概念2.2 评价步骤 3. 模糊综合评价的数学模型3.1 数学表达3.2 模糊合成运算 4. 模糊综合评价的应用领域5. 模糊综合评价的优缺点5.1 优点5.2 缺点 6. 模糊综合评价…...

C++ 语法之数组指针

一维数组&#xff1a; 如果我们定义了一个一维数组&#xff0c;那么这个数组名&#xff0c;就是指向第一个数组元素的地址&#xff0c;也即&#xff0c;是整个数组分配的内存空间的首地址。 比如 int a[3]; 定义了一个包含三个元素的数组。因为一个int占4个字节&#xff0c;那…...

从0到1在windows上用flutter开发android app(环境准备、创建项目、加速构建)

一、项目环境准备 ​1、设置环境变量 需配置以下两个核心环境变量,以替换官方资源链接为国内镜像: ​Windows系统​(通过PowerShell或系统属性面板设置) # 临时生效(当前会话) $env:PUB_HOSTED_URL = "https://pub.flutter-io.cn" $env:FLUTTER_STORAGE_BA…...

PLY格式文件如何转换成3DTiles格式——使用GISBox软件实现高效转换

一、概述 在三维GIS和数字孪生领域&#xff0c;3DTiles格式已成为主流的数据格式之一。它由Cesium团队提出&#xff0c;专为大规模3D数据可视化设计&#xff0c;能够高效地加载和展示海量模型数据。而PLY格式则是一种常见的三维模型文件格式&#xff0c;主要用于存储点云数据或…...

Java定时任务的三重境界:从单机心跳到分布式协调

《Java定时任务的三重境界&#xff1a;从单机心跳到分布式协调》 本文将以生产级代码标准&#xff0c;揭秘Java定时任务从基础API到分布式调度的6种实现范式&#xff0c;深入剖析ScheduledThreadPoolExecutor与Quartz Scheduler的线程模型差异&#xff0c;并给出各方案的性能压…...

响应压缩导致的接口请求response没有响应体问题排查

目录 一、背景二、排查过程三、解决方法四、学习与思考-响应压缩&#xff08;一&#xff09;可能原因&#xff08;二&#xff09;深入排查&#xff08;三&#xff09;注意 一、背景 接口发布到测试环境&#xff0c;测试同学说没有数据 二、排查过程 1、本地用相同的参数、相…...