简单工厂,工厂方法 和 抽象工厂
这三种模式, 都是创建类型的模式, 将对象的创建流程封装起来供客户调用
简单工厂模式
简介
: 和策略模式一样,就是针对不通的参数, 返回不通的实例而已
问题
: 没有遵循开闭原则, 如果我们想增加一种类, 那么就要修改工厂的核心代码,这违反了对修改关闭
的原则, 于是有了 工厂方法模式
策略模式
和简单工厂模式
的代码用例
class Operator
{
public:int first, second;Operator() {};Operator(int a, int b) : first(a), second(b) {};virtual int get_result() = 0;
};class AddOperator : public Operator
{
public:AddOperator() {};AddOperator(int a, int b) : Operator(a, b) {};int get_result() override{return first + second;}
};class MulOperator : public Operator
{
public:MulOperator() {};MulOperator(int a, int b) : Operator(a, b) {};int get_result() override{return first * second;}
};// strategy
int get_result(char _type, int a, int b)
{Operator* o{};if (_type == '+')o = new AddOperator(a, b);if (_type == '*')o = new MulOperator(a, b);return o->get_result();
}// simple factory
class OperatorFactory
{
public:Operator* get_operator(char c){Operator* o{};if (c == '+')o = new AddOperator();if (c == '*')o = new MulOperator();return o;}
};int main()
{//策略模式int a = get_result('+', 1, 2);cout << a << endl;int b = get_result('*', 8, 9);cout << b << endl;// 简单工厂模式OperatorFactory* op_factory = new OperatorFactory();Operator* o = op_factory->get_operator('+');o->first = 1;o->second = 2;cout << o->get_result() << endl;
}
工厂方法模式
简介
: 在简单工厂的基础上,遵循开闭原则
, 每个工厂都只产出自己的类, 那么再有新的类要加入的时候, 我们只需要添加一个工厂子类 和 目标子类就行了
问题
: 工厂只能产出一种目标类的实例, 这样的话, 系统中类一多, 工厂就会太多.
`代码``
class Operator
{
public:int first, second;Operator() {};Operator(int a, int b) : first(a), second(b) {};virtual int get_result() = 0;
};class AddOperator : public Operator
{
public:AddOperator() {};AddOperator(int a, int b) : Operator(a, b) {};int get_result() override{return first + second;}
};class MulOperator : public Operator
{
public:MulOperator() {};MulOperator(int a, int b) : Operator(a, b) {};int get_result() override{return first * second;}
};class Factory
{
public:virtual Operator* get_operator(int a, int b) = 0;
};class AddFactory : public Factory
{
public:Operator* get_operator(int a, int b) override{Operator* op = new AddOperator(a, b);return op;}
};class MulFactory : public Factory
{
public:Operator* get_operator(int a, int b) override{Operator* op = new MulOperator(a, b);return op;}
};int main()
{// 工厂方法模式AddFactory* add_f = new AddFactory();Operator* op = add_f->get_operator(1, 2);cout << op->get_result() << endl;
}
抽象工厂模式
简介
: 一个工厂产出一系列互相关联的类的实例, 实现产品簇的效果
代码
class SoftWare
{
public:SoftWare() {};
};class AndroidSoftWare : public SoftWare
{
public:AndroidSoftWare() {};
};class IosSoftWare : public SoftWare
{
public:IosSoftWare() {};
};class Phone
{
public:SoftWare* ware;virtual void set_soft_ware(SoftWare* ware) = 0;
};class XiaoMiPhone : public Phone
{
public:void set_soft_ware(SoftWare* w) override{cout << "xiao mi phone set android soft ware" << endl;ware = w;}
};class IosPhone : public Phone
{
public:void set_soft_ware(SoftWare* w) override{cout << "ios phone set ios soft ware" << endl;ware = w;}
};// 这种情况下, 用抽象工厂模式, 就不会出错, 不会出现iosphone配上了android soft ware的情况
// 不然在实际项目中, 配错很可能会出现严重后果
class AbstractFactory
{
public:virtual Phone* create_phone() = 0;virtual SoftWare* create_soft_ware() = 0;
};class XiaoMiFactory : public AbstractFactory
{Phone* create_phone() override{Phone* p = new XiaoMiPhone();return p;}SoftWare* create_soft_ware() override{SoftWare* sw = new AndroidSoftWare();return sw;}
};class IosFactory : public AbstractFactory
{Phone* create_phone() override{Phone* p = new IosPhone();return p;}SoftWare* create_soft_ware() override{SoftWare* sw = new IosSoftWare();return sw;}
};
int main()
{// 很多情况下, 工厂不止是生产一种类, 而是生产一整套互相关联的类, 这样一个工厂, 就是抽象工厂模式AbstractFactory* af = new XiaoMiFactory();Phone* p1 = af->create_phone();SoftWare* sw = af->create_soft_ware();p1->set_soft_ware(sw);af = new IosFactory();Phone* p2 = af->create_phone();SoftWare* sw2 = af->create_soft_ware();p2->set_soft_ware(sw2);
}
相关文章:
简单工厂,工厂方法 和 抽象工厂
这三种模式, 都是创建类型的模式, 将对象的创建流程封装起来供客户调用 简单工厂模式 简介: 和策略模式一样,就是针对不通的参数, 返回不通的实例而已 问题: 没有遵循开闭原则, 如果我们想增加一种类, 那…...
python 压力测试脚本
需求: 生成一个12位不重复的随机数将随机数赋值给Json 串中的 orderCode字段将Json用ECB 指定 key为bJXQezYtR4ZSNK4p进行加密并作为值传给{ “data”: “” }设置每秒30个并发持续1分钟调用接口接口输出测试测试报告 代码示例 import json import random import…...

【Linux】多线程7——线程池
1.线程池的概念 1.1.池化技术 池化技术指的是提前准备一些资源,在需要时可以重复使用这些预先准备的资源。 在系统开发过程中,我们经常会用到池化技术。通俗的讲,池化技术就是:把一些资源预先分配好,组织到对象池中…...

Linux Shell实例
1.查空行 答案: awk /^$/{print NR} file1.txt#awk:一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析#处理。 #1)基本语法 #awk [选项参数]/pattern1/{action1} /pattern…...
Linux~MySQL数据库具体操作
一、数据库的字符集编码设置 (一)查看数据库默认的字符集 MariaDB [(none)]> show variables like %character%; ------------------------------------------------------ | Variable_name | Value | ------------…...

Unity WebGL平台Hybrid Generate All报错undefined symbol sendfile
详细报错信息如下: Library\Bee\artifacts\WebGL\build\debug_WebGL_wasm\build.js: undefined symbol: sendfile (referenced by top-level compiled C/C code) UnityEditor.BuildPipeline:BuildPlayer (UnityEditor.BuildPlayerOptions) HybridCLR.Editor.Comman…...
Java高级Day28-多线程
83.多线程 什么是线程: 线程右进程创建的,是进程的一个实体 一个进程可以有多个线程 并发:同一个时刻,多个任务交替执行,造成一种貌似同时的错觉 并行:同一个时刻,多个任务同时执行&#x…...
0003 保险的会计要素及其计量属性
与一般行业相同,保险业的会计要素主要包括资产、负债、所有者权益、收入、成本与费用以及利润六个方面。然而,在某些特定的要素上,保险业展示了其独特之处。 资产:由于保险本质上是一种承诺而非实物商品,因此保险业不持…...
Swift版本控制的艺术:掌握代码演化的魔杖
标题:Swift版本控制的艺术:掌握代码演化的魔杖 在Swift开发的世界中,代码的版本管理是一个核心议题。它不仅关系到代码的组织和追踪,更是团队协作和项目持续交付的关键。本文将深入探讨如何在Swift中利用版本管理工具,…...
学习实战:生活垃圾自动识别与分类系统的实现
引言 在日常生活中,垃圾分类是保护环境的重要措施之一。然而,手动分类不仅耗时,还容易出错。基于深度学习的垃圾检测与分类系统能够自动识别和分类不同类型的垃圾,从而提高分类效率。 目录 项目概述 项目背景与意义系统功能介绍…...
Swift模块化构建:解锁代码重用的金钥匙
标题:Swift模块化构建:解锁代码重用的金钥匙 在Swift编程的宏伟蓝图中,模块化不仅是提升代码组织性的关键,更是实现高效开发与维护的法宝。本文将深入探讨Swift模块化构建工具的使用,揭示如何通过模块化将代码转化为可…...
【计算机网络】CIDR无分类编址知识学习
文章目录 1、CIDR引入的背景2、CIDR是什么?2.1 CIDR的2个特点2.2 CIDR斜线记法注意区分细节2.3 路由聚合or构成超网2.4 CIDR里面的掩码(不是叫子网掩码)2.5 CIDR几种等效的记法形式2.6 对于”网络前缀“不是8的整数倍时候,要多加注意 3、CIDR…...
JavaScript 详解
第一章 JavaScript简介 为什么学习javascript ? JavaScript 是全球最流行的编程语言。 JavaScript 是属于 Web 的编程语言。 JavaScript 是 web 开发者必学的三种语言之一: HTML 定义网页的内容 CSS 规定网页的布局 JavaScript 对网页行为进行编程 …...
运维实践01-安装OpenJDK
前几天逛知乎,有个问题是如何成为一个优秀的运维工程师,有个回答是让自己搞清楚如下几件事情。 首先,搭4台Linux的服务器。然后完成如下操作 批量安装最新版OpenJDK安装部署elastic search集群安装部署mysql9.0,实现一主三备。安…...

Windows下,C# 通过FastDDS高效通信
目录 1、安装FastDDS 库2、使用IDL定义自己的数据格式3、生成DLL3.1 托管 (Managed)模式3.2 非托管 (Unmanaged)模式 -- 可用于Unity 代码示例 eprosima Fast DDS is a C implementation of the DDS (Data Distribution Service) …...
【模型】ResNet
ResNet(Residual Network,残差网络)是一种用于图像识别等任务的深度神经网络架构,由何凯明等人于2015年提出。它在计算机视觉领域中具有重要意义,因为它解决了随着网络层数加深而导致的“梯度消失”或“梯度爆炸”问题…...
Objective-C中NSExpression与NSPredicate的协同艺术
标题:Objective-C中NSExpression与NSPredicate的协同艺术 引言 在Objective-C的丰富生态中,NSExpression和NSPredicate是两个强大的工具,它们在处理数据集合和执行复杂查询时发挥着关键作用。本文将深入探讨这两个API的协同工作方式&#x…...

Apache-JMeter压测工具教程
下载安装 《JMeter官网下载》 下载完成后,找个文件夹进行解压 配置环境变量 JAVA_HOME(如果是JAVA8还需要配置CLASSPATH)、JMETER_HOME JMETER_HOME修改bin目录下的jmeter.properties文件编码为UTF-8 5.6.3这个版本encoding已经默认为UT…...

Spring Boot集成selenium实现自动化测试
1.什么是selenium? Selenium 是支持web 浏览器自动化的一系列工具和 库的综合项目。 它提供了扩展来模拟用户与浏览器的交互,用于扩展浏览器分配的分发 服务器, 以及用于实现W3C WebDriver 规范 的基础结构, 该规范允许您为所有主…...

基于phpstudy对cmseasy5.5进行漏洞复现
目录: 漏洞复现的cmseasy5.5百度网盘链接 安装cmseasy: 1.在phpstudy上安装cmseasy 2.设置mysql密码为phpstudy内置mysql的密码并检查安装环境 3.安装后查看mysql内cmseasy是否有内容 获取用户名和密码过程: 1.查看源码发现有个remotelo…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...

JDK 17 序列化是怎么回事
如何序列化?其实很简单,就是根据每个类型,用工厂类调用。逐个完成。 没什么漂亮的代码,只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...