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

简单工厂模式(Simple Factory Pattern) 是一种创建型设计模式,它定义了一个工厂类,通过这个工厂类可以创建不同类型的对象。简单工厂模式的主要目的是将对象的创建逻辑集中在一个地方,简化客户端的代码,使得客户端不需要直接实例化具体的类。
简单工厂模式的核心要素:
- Product(产品接口):定义了工厂方法所创建的对象的接口。
- ConcreteProduct(具体产品):实现了
Product接口的具体类。 - Factory(工厂):提供一个静态方法来创建
Product对象的实例。
示例:创建不同类型的 Shape 对象
我们将使用简单工厂模式来创建不同类型的 Shape 对象,例如 Circle 和 Rectangle。
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;
}
解释
Shape类是产品接口,定义了所有具体产品必须实现的方法draw。Circle和Rectangle类是具体产品,它们实现了Shape接口的draw方法。ShapeFactory类是工厂,提供一个静态方法createShape,根据传入的类型参数创建不同的Shape对象。这种方法将对象创建的逻辑集中在工厂类中,简化了客户端的代码。main函数 中,通过工厂方法创建Shape对象,并调用其draw方法进行演示。
简单工厂模式的优点在于它将对象创建的逻辑集中到工厂类中,使得客户端代码变得更简单、更清晰。然而,简单工厂模式也有局限性,例如它违反了开闭原则(即添加新产品时需要修改工厂代码)。在需要扩展产品类型时,可以考虑使用工厂方法模式或抽象工厂模式等更灵活的设计模式。
相关文章:
设计模式---简单工厂模式
简单工厂模式(Simple Factory Pattern) 是一种创建型设计模式,它定义了一个工厂类,通过这个工厂类可以创建不同类型的对象。简单工厂模式的主要目的是将对象的创建逻辑集中在一个地方,简化客户端的代码,使得…...
Vue | Vue 中的 refInForde 用法
refInFor:如果你在渲染函数中给多个元素都应用了相同的 ref 名,那么 $refs.myRef 会变成一个数组。 vue中的refInFor属性是Vue框架中用于在循环渲染的元素上设置引用的一种方式。 在Vue中,ref属性通常用于给元素或子组件注册引用信息&am…...
【原创】java+swing+mysql房屋租赁管理系统设计与实现
个人主页:程序员杨工 个人简介:从事软件开发多年,前后端均有涉猎,具有丰富的开发经验 博客内容:全栈开发,分享Java、Python、Php、小程序、前后端、数据库经验和实战 文末有本人名片,希望和大家…...
Django 中render、redirect 和 HttpResponse的区别
在 Python 的 Web 框架 Django 中,render, redirect 和 HttpResponse 是用于处理 HTTP 响应的不同函数,它们各自有不同的用途: HttpResponse: HttpResponse 是 Django 中最基本的响应对象,用于返回给客户端的 HTTP 响应…...
CRYPTO 2020
分类文章编号安全模型1-6公钥加密,功能加密,见证加密7-12后量子密码13-20密码分析21-31最佳论文32-34多方安全计算35-49真实应用50-55零知识证明56-62格和相关难题63-68泄露和外包加密69-74非交互式零知识证明,共识和延迟函数75-79构建80-85Security Models 1. Handling Ad…...
java 函数接口Consumer简介与示例【函数式编程】【Stream】
Java 8 中的 消费者接口Consumer 是一个函数接口,它可以接受一个泛型 类型参数,它属于java.util.function包。我们来看看Java函数接口库中的定义: FunctionalInterface public interface Consumer<T> {/*** Performs this operation o…...
黑神话:悟空-配置推荐
显卡推荐(按类别整理) 1. GTX 10系列、GTX 16系列: 如果希望体验光线追踪,建议根据预算升级到RTX 40系列显卡。对于1080p分辨率,至少需要RTX 4060才能流畅运行。 2. RTX 20系列: RTX 2060、RTX 2070&#…...
Android14 蓝牙设备类型修改
Android14 蓝牙设备类型设置修改设置 文章目录 Android14 蓝牙设备类型设置修改设置一、前言二、修改蓝牙设备类型1、蓝牙设备类型和对应的属性2、Debug设备设置和获取蓝牙设备类型3、系统源码中设置蓝牙设备类型4、Java代码中设置蓝牙prop属性可行吗? 三、其他1、A…...
vue3 语法糖<script setup>
在 Vue 3 中,<script setup>是一种新的语法糖,它极大地简化了组件的编写方式。 <script setup> 是在单文件组件 (SFC) 中使用组合式 API 的编译时语法糖。当同时使用 SFC 与组合式 API 时该语法是默认推荐。 基本概念 简洁的语法…...
微服务设计原则——高性能:异步与并发
文章目录 1.异步1.1 调用异步1.2 流程异步1.3 数据流异步1.4 小结 2.并发2.1 请求并发2.2 冗余请求2.3 小结 参考文献 1.异步 对于处理耗时长的任务,如果采用同步等待的方式,会严重降低系统的吞吐量,可以采用异步化进行解决。 异步…...
机器学习——决策树,朴素贝叶斯
一.决策树 决策树中的基尼系数(Gini Index)是用于衡量数据集中不纯度(或混杂度)的指标。基尼系数的取值范围在0到0.5之间,其中0表示数据完全纯(同一类别),0.5表示数据完全混杂。 基…...
C语言基础(十)
编译预处理命令: 预编译命令在C语言中用于在编译前进行一些特定的处理和控制,帮助程序员更灵活地管理源代码和控制编译过程。 C语言常用的预编译命令: #include:用于包含头文件,将另一个文件的内容插入到当前文件中…...
人像比对-人证比对-人脸身份证比对-人脸身份证实名认证-人脸三要素对比-实人认证
人脸身份证实名认证是一种基于生物识别技术的身份验证方式,主要依托证件OCR识别技术、活体检测、人脸比对等技术手段,对用户身份信息真实性进行核验,确保用户为真人且为本人。以下是关于人脸身份证实名认证的详细解析: 一、认证流…...
Android 上下滑隐藏显示状态栏
一、DisplayPolicy类中监听滑动事件,然后发送广播事件 Android12类路径: frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.javamSystemGestures new SystemGesturesPointerEventListener(mUiContext, mHandler,new SystemGest…...
USBCAN-II/II+使用方法以及qt操作介绍
一.USBCAN-II/II介绍 USBCAN-II/II 是一款常用的 USB-CAN 转换器,广泛应用于汽车电子、工业自动化等领域。以下是使用该设备的一般步骤和方法: 1. 硬件连接 连接设备:将 USBCAN-II/II 的 USB 接口连接到计算机的 USB 端口。 连接 CAN 网络…...
笔记-系统规划与管理师-案例题-2022年-IT服务部署实施
【说明】 某大型企业去年信息化投入大,完成了重点核心业务系统的建设。由于应急相应预案制定得不充分并且未开展演练,出现了系统性故障时,部分关键的应用系统不可用且在12小时内未能完成恢复业务,给企业带来了较大损失。 为加强该…...
Kubernetes 清理资源常用的 Kubernetes 清理命
清理特定状态的 Pod: 清理 Evicted 状态的 Pod: kubectl get pods --all-namespaces -o wide | grep Evicted | awk {print $1,$2} | xargs -L1 kubectl delete pod -n清理 Error 状态的 Pod: kubectl get pods --all-namespaces -o wide | g…...
【数据结构初阶】二叉树--基本概念
hello! 目录 一、树 1.1 树的概念和结构 1.2 树的相关术语 1.3 树的表示 1.4 树形结构实际应用场景 二、二叉树 2.1 概念和结构 2.2 特殊的二叉树 2.2.1 满二叉树 2.2.2 完全二叉树 2.3 二叉树的存储结构 2.3.1 顺序结构 2.3.2 链式结构 …...
Pytorch添加自定义算子之(12)-开闭原则设计tensorrt和onnxruntime推理语义分割模型
一、开闭原则 开闭原则是SOLID原则中的一个,指的是尽量使用开放扩展,关闭修改的设计原则。 在C++中如何使用开闭原则导出动态库,可以按照以下步骤进行: 定义抽象基类:定义动态库中的抽象基类,该基类应该封装可扩展的接口。 实现派生类:实现基类的派生类,这些派生类将封…...
第二百零九节 Java格式 - Java数字格式类
Java格式 - Java数字格式类 以下两个类可用于格式化和解析数字: java.text.NumberFormatjava.text.DecimalFormat NumberFormat 类可以格式化一个数字特定地区的预定义格式。 DecimalFormat 类可以格式化数字以特定区域设置的自定义格式。 NumberFormat类的 getXXXInstance…...
PHPStudy本地开发,用上Redis 5的Stream和HyperLogLog到底有多香?
PHPStudy本地开发中Redis 5的Stream与HyperLogLog实战指南 Redis作为高性能的内存数据库,在PHP开发中扮演着重要角色。当我们在本地开发环境使用PHPStudy时,默认安装的Redis 3.0.504版本功能有限,无法体验Redis 5引入的强大新特性。本文将深…...
Windows 10/11 环境下 OpenClaw v2.7.1 安装避坑与常见问题解决方案
🦞 OpenClaw v2.7.1 Windows 一键部署教程|5 分钟搭建本地 AI 智能体 在本地 AI 自动化工具快速普及的当下,OpenClaw(小龙虾)凭借全程可视化、一键部署、本地运行的特点,成为 Windows 平台上易用性突出的 …...
Anaconda环境翻车实录:从‘CondaMemoryError’到完美恢复的完整指南
Anaconda环境崩溃自救手册:从诊断到彻底修复的实战指南 那天下午,当你在终端第15次尝试运行conda update --all时,屏幕上突然跳出鲜红的"CondaMemoryError"字样,整个开发环境瞬间陷入瘫痪。这不是普通的报错,…...
【管理科学】【财务领域】【社会科学】人的需求来源和由需求诞生的企业/业务/行业及其上游产业链/中游产业链/下游产业链的所有内容03
编号 类型 (核心功能) 人的需求类型 (对应场景) 人需求得以满足的信息产品/实体产品/制造加工工具/原材料/其他 由需求诞生的企业/业务/行业及其上游产业链/中工产业链/下游产业链的所有内容及多学科数学建模方程式 /时序数学方程式及货币来源及业务财务模型 流动时序方程…...
从零构建现代桌面应用导航:PyQt-Fluent-Widgets导航组件实战指南
从零构建现代桌面应用导航:PyQt-Fluent-Widgets导航组件实战指南 【免费下载链接】PyQt-Fluent-Widgets A fluent design widgets library based on C Qt/PyQt/PySide. Make Qt Great Again. 项目地址: https://gitcode.com/gh_mirrors/py/PyQt-Fluent-Widgets …...
CDFControl工具详解,搞定云桌面黑屏、卡顿、随机掉线疑难故障
一 前言 在企业Citrix云桌面运维工作中,我们经常遇到一类无明确报错、间歇性复现的疑难故障。常规Windows事件查看器日志干净无报错,常规DDC控制台监控无异常,但终端用户会频繁出现登录黑屏、会话卡顿、虚拟机随机掉线、VDA注册超时等问题。 很多运维人员遇到此类问题只能…...
边缘计算大模型部署实战:从LLaMA量化到树莓派推理优化
1. 项目概述:一个为边缘计算优化的轻量级大语言模型最近在折腾边缘设备上的AI应用,发现一个挺有意思的项目——KuiperLLama。这名字听起来就很有“边缘”感,Kuiper(柯伊伯带)是太阳系边缘的一个区域,用它来…...
如何在Windows上轻松安装ViGEmBus虚拟手柄驱动解决游戏兼容性问题
如何在Windows上轻松安装ViGEmBus虚拟手柄驱动解决游戏兼容性问题 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 你是否曾经遇到过这样的困扰:手…...
牛津树资源合集
022-牛津树学校版 1-16级 文件大小: 6.8GB内容特色: 16阶校园版绘本音频一次打包,6.8G进阶无痛适用人群: 想省补习费的3-12岁家长核心价值: 跟着牛津进度走,词汇语感双飙升下载链接: https://pan.quark.cn/s/1ae54f5fbf4f Susan教英语《牛津树家庭版 L…...
