设计模式---简单工厂模式

news2024/12/22 16:42:24

简单工厂模式(Simple Factory Pattern) 是一种创建型设计模式,它定义了一个工厂类,通过这个工厂类可以创建不同类型的对象。简单工厂模式的主要目的是将对象的创建逻辑集中在一个地方,简化客户端的代码,使得客户端不需要直接实例化具体的类。

简单工厂模式的核心要素:

  1. Product(产品接口):定义了工厂方法所创建的对象的接口。
  2. ConcreteProduct(具体产品):实现了 Product 接口的具体类。
  3. Factory(工厂):提供一个静态方法来创建 Product 对象的实例。

示例:创建不同类型的 Shape 对象

我们将使用简单工厂模式来创建不同类型的 Shape 对象,例如 CircleRectangle

1. 定义 Shape 类(产品接口)
#include <iostream>

// Product interface
class Shape {
public:
    virtual ~Shape() = default;
    virtual void draw() const = 0;
};

2. 定义 ConcreteProduct 类(具体产品)

// ConcreteProduct 1
class Circle : public Shape {
public:
    void draw() const override {
        std::cout << "Drawing a circle." << std::endl;
    }
};

// ConcreteProduct 2
class Rectangle : public Shape {
public:
    void draw() const override {
        std::cout << "Drawing a rectangle." << std::endl;
    }
};

3. 定义 Factory 类(工厂)

#include <string>

// Factory
class ShapeFactory {
public:
    static Shape* createShape(const std::string& type) {
        if (type == "Circle") {
            return new Circle();
        } else if (type == "Rectangle") {
            return new Rectangle();
        } else {
            return nullptr;
        }
    }
};

4. 使用简单工厂模式

int main() {
    // 使用工厂创建不同类型的 Shape 对象
    Shape* shape1 = ShapeFactory::createShape("Circle");
    Shape* shape2 = ShapeFactory::createShape("Rectangle");

    // 调用方法
    if (shape1) {
        shape1->draw();
    }
    if (shape2) {
        shape2->draw();
    }

    // 清理资源
    delete shape1;
    delete shape2;

    return 0;
}

解释

  1. Shape 类是产品接口,定义了所有具体产品必须实现的方法 draw
  2. CircleRectangle 类是具体产品,它们实现了 Shape 接口的 draw 方法。
  3. ShapeFactory 类是工厂,提供一个静态方法 createShape,根据传入的类型参数创建不同的 Shape 对象。这种方法将对象创建的逻辑集中在工厂类中,简化了客户端的代码。
  4. main 函数 中,通过工厂方法创建 Shape 对象,并调用其 draw 方法进行演示。

简单工厂模式的优点在于它将对象创建的逻辑集中到工厂类中,使得客户端代码变得更简单、更清晰。然而,简单工厂模式也有局限性,例如它违反了开闭原则(即添加新产品时需要修改工厂代码)。在需要扩展产品类型时,可以考虑使用工厂方法模式或抽象工厂模式等更灵活的设计模式。

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

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

相关文章

代码复现改进

代码复现&#xff0c;文献复现&#xff0c;文章复现&#xff0c; 算法复现&#xff0c;科研复现 Matlab,Python中英文均可 保证质量&#xff0c;加快你的研究速度 代码改进跑通&#xff0c;模型优化改进

Java - IDEA开发

使用IDEA开发Java程序步骤&#xff1a; 创建工程 Project&#xff1b;创建模块 Module&#xff1b;创建包 Package&#xff1b;创建类&#xff1b;编写代码&#xff1b; 如何查看JDK版本 Package介绍: package是将项目中的各种文件,比如源代码、编译生成的字节码、配置文件、…

Linux驱动开发基础(设备树)

所学来自百问网 目录 1. 引入设备树的原因 2. 设备树语法 2.1 Devicetree格式 2.1.1 DTS文件格式 2.1.2 node的格式 2.1.3 properties的格式 2.1.4 dts 文件包含dtsi文件 2.2 常用属性 2.2.1 #address-cells、#size-cells 2.2.2 compatible 2.2.3 model 2.2.4 st…

使用 Go 语言将 Base64 编码转换为 PDF 文件

使用Go语言将PDF文件转换为Base64编码-CSDN博客文章浏览阅读104次&#xff0c;点赞2次&#xff0c;收藏5次。本文介绍了如何使用 Go 语言将 PDF 文件转换为 Base64 编码&#xff0c;并保存到文件中。https://blog.csdn.net/qq_45519030/article/details/141224319 在现代编程中…

一、前后端分离通用权限系统(1)

&#x1f33b;&#x1f33b; 目录 一、项目介绍1.1 项目简介1.1.1 项目特色1.1.2 项目背景1.1.3 前置知识1.1.4 项目大纲 1.2 项目详细介绍1.2.1 介绍1.2.2 核心技术1.2.3 项目模块1.2.4 数据库设计 二、搭建环境2.1、搭建项目结构2.1.1、搭建父工程 gansu-auth-parent2.1.2、搭…

Unity 求坐标点在扇形区域内的投影

视频效果&#xff1a; 代码: /// <summary>/// 投影在扇形区域内的点/// </summary>/// <param name"targetPos">目标点</param>/// <param name"fanRadius">扇形半径</param>/// <param name"fanAngle"…

企业为什么需要安装加密软件

1. 数据保护 防止数据泄露&#xff1a;加密软件通过对敏感数据进行加密处理&#xff0c;确保即使数据在传输或存储过程中被截获&#xff0c;也无法被未授权人员读取或利用&#xff0c;从而有效防止数据泄露。 完整性保护&#xff1a;加密不仅保护数据的机密性&#xff0c;还通…

Vue3+ElementPlus,侧边栏菜单折叠时,图标不显示踩坑笔记

问题如下&#xff1a; 折叠前&#xff1a; 折叠后&#xff1a; 一般有三个问题&#xff0c;会导致这个错误&#xff1a; 排查1 动态图标渲染时&#xff0c;要写el-icon&#xff0c;否则也是不显示的 排查2 嵌套路由需要写在插槽里面&#xff0c;不是嵌套路由则需要写在插…

Ubuntu中服务部署

Ubuntu中服务部署 一、root用户密码一、SSH远程连接二、JDK1.8安装1、解压上传的安装包2、配置jdk环境变量 三、minio安装1、官网下载安装包2、上传文件并授权3、书写启动脚本4、启动及说明5、启动异常 四、nacos安装1、下载上传安装包&#xff0c;并解压2、修改启动脚本3、配置…

【网络安全】重置密码token泄露,实现账户接管

未经许可&#xff0c;不得转载。 文章目录 正文 正文 对某站点测试过程中&#xff0c;登录账户触发忘记密码功能点&#xff0c;其接口、请求及响应如下&#xff1a; PUT /api/v1/people/forgot_password 可以看到&#xff0c;重置密码token和密码哈希均在响应中泄露。 删除co…

openharmony 南向开发基础:ohos自定义子系统,自定义部件,调用hilog部件,hilog日志封装傻瓜式教程

openharmony 南向开发基础:ohos自定义子系统,自定义部件,调用hilog部件,hilog日志封装 自定义单部件 关于开源鸿蒙的南向教程不多,很多都是从官方文档上抄的的例子,官网的例子不是很适合入门,写的很粗糙,不适合傻瓜阅读,毕竟对于刚入行鸿蒙的新手而言,gn语法就是第一劝退魔咒…

TinaSDKV2.0 Kernel基本开发

TinaSDKV2.0 Kernel基本开发 Tina-SDK Linux系统启动流程&#xff1a; Linux Kerenl目录结构 设备树配置文件位置 100ASK_T113s3-Industrial-DevKit开发板LinuxKernel配置文件&#xff1a; device/config/chips/t113/configs/100ask/linux/config-5.4 100ASK_T113s3-Industr…

学习笔记--算法(滑动窗口)9

长度最小的子数组 链接&#xff1a; . - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a;给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 子数组子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0…

高性能日志系统 性能测试

百万并发压测 测试环境 云服务器环境 2核2G 2M Linux华为云服务器Ubuntu系统本地电脑环境 处理器&#xff1a;AMD Ryzen 7 4800H with Radeon Graphics2.90 GHz已安装的内存(RAM):16.0GB(15.4GB可用)系统类型&#xff1a;64位操作系统&#xff0c;基于x64的处理器 测试结果 响应…

软件工程造价师习题练习 5

1.下面哪项是EO的主要目的&#xff08; &#xff09; A. 改变应用行为 B. 维护一个或多个ILFs C. 呈现信息给用户 D. 执行数学公式和计算 外部输出&#xff08;EO&#xff09;是发送数据或控制信息到边界外部的基本过程&#xff0c;与EQ相比还包含了额外的处理逻辑。EO的主…

TypeError: Cannot read properties of undefined (reading ‘scrollIntoView‘)(已解决)

问题复现&#xff1a;眨眼睛使用vitevue3实现跳转dom功能时使用了scrollIntoView方法&#xff0c;在打包上传以后使用该功能报错 小友可能会陷入误区&#xff0c;以为是函数方法有问题&#xff0c;毕竟在开发时是没有问题的&#xff0c; 而实际上呢问题出在获取节点失败了 在这…

企业级批量无人值守安装

企业级批量无人值守安装 一、批量无人值守安装1.简介PXE工作流程 2.核心技术&#xff08;dhcp、httpd、tftp&#xff09;3.实验3.1 准备环境3.2 防护关闭3.3 软件安装3.4 软件配置DHCP服务设置httpd服务配置tftp服务配置 3.5 编写引导安装相关文件&#xff0c;放到指定位置3.5.…

基于SpringCloud的能源管理系统-能源管理平台源码-能源在线监测平台-双碳平台源码-SpringCloud全家桶-能管管理系统源码

介绍 适用于高能耗企业、建筑、工厂、园区的水、电、气、热、油、空压机等能源数据采集、分析、报表&#xff1b; 基于SpringCloud的能源管理系统-能源管理平台源码-能源在线监测平台-双碳平台源码-SpringCloud全家桶-能管管理系统源码 软件架构 软件功能 数字大屏 使用说明

关于鸣潮启动器450张图片杂谈—从代码分析为何使用帧动画

关于鸣潮启动器450张图片杂谈—从代码分析为何使用帧动画 前言 在鸣潮启动器的目录下 Wuthering Waves\kr_game_cache\animate_bg\99de27ae82e3c370286fba14c4fcb699打开该目录发现有450张图片&#xff0c;不难看出启动器的背景动画是由这450张图片不断切换实现的 qt框架 从…

小白公式量化--用Python指标公式模块做量化策略研究

《小白公式量化系统》是纯Python开发的&#xff0c;因此我们可以借用《小白公式量化系统》的金融模块&#xff0c;来实现自己的Python量化框架&#xff0c;以及用Python实现量化研究、选股、人工智能机器学习&#xff0c;以及打造自己的行情软件和量化平台。我们后面文章讲介绍…