设计模式之简单工厂模式、工厂模式、抽象工厂模式
参考: 设计模式笔记
简单工厂模式
● 将类的创建过程交给工厂类实现,如果需要一个类对象,则直接通过工厂创建一个类。
● 简单工厂模式不符合开闭原则
● 适用场景:工厂类负责创建的对象比较少;客户端只知道传入工厂类的参数,对于如何创建对象不关心
/*
类的创建过程交给工厂类来实现,如果需要一个类的对象,则直接通过工厂创建一个对应的类对象
*/
#include<iostream>
using namespace std;
class AbstractFruit{
public:virtual void showName()=0;
};//苹果
class Apple:public AbstractFruit{
public:virtual void showName(){cout<<"i am a appple"<<endl;}
};
//香蕉
class Banana:public AbstractFruit{
public:virtual void showName(){cout<<"i am a banana"<<endl;}
};//水果工厂
class FruitFactory{
public:static AbstractFruit*createFruit(string type){if(type=="apple"){return new Apple();}else if(type=="banana"){return new Banana();}else return nullptr;}
};int main(){FruitFactory*factory=new FruitFactory();AbstractFruit*fruit=factory->createFruit("apple");fruit->showName();//i am a apppledelete fruit;fruit=factory->createFruit("banana");fruit->showName();//i am a bananadelete fruit;delete factory;return 0;}
工厂模式(简单工厂模式+开闭原则)
● 代码扩展时不需要修改工厂类
● 类急速膨胀,不利于维护
● 适用场景:消费者不关心它所要创建的产品类;或者知道要创建的产品类二不关心如何创建的时候
/*简单工厂模式+开闭原则
*/
#include<iostream>
using namespace std;
class AbstractFruit{
public:virtual void showname()=0;
};class Apple:public AbstractFruit{
public:virtual void showname(){cout<<"i am a apple"<<endl;}
};class Banana:public AbstractFruit{
public:virtual void showname(){cout<<"i am a banana"<<endl;}
};
class Orange:public AbstractFruit{
public:virtual void showname(){cout<<"i am an orange"<<endl;}
};//之前是水果工厂,如果要添加对象都会在工厂里面添加,破坏了开闭原则
//设计成抽象工厂
class AbstractFactory{
public:virtual AbstractFruit*createFruit()=0;};//苹果工厂
class AppleFactory:public AbstractFactory{
public:virtual AbstractFruit*createFruit(){return new Apple();}
};//香蕉工厂
class BananaFactory:public AbstractFactory{
public:virtual AbstractFruit*createFruit(){return new Banana();}
};
//橙子工厂
class OrangeFactory:public AbstractFactory{
public:virtual AbstractFruit*createFruit(){return new Orange();}
};int main(){AbstractFactory*factory=new AppleFactory();AbstractFruit*fruit=factory->createFruit();fruit->showname();//i am a appledelete factory;delete fruit;factory=new BananaFactory();fruit=factory->createFruit();fruit->showname(); //i am a bananadelete factory;delete fruit;factory=new OrangeFactory();fruit=factory->createFruit();fruit->showname();//i am an orangedelete factory;delete fruit;return 0;}
抽象工厂模式(增加产品族方便)
● 产品族:同一产地或者同一产商,功能不同
● 产品等级:功能相同,产地或者产商不同
● 不符合开闭原则,增加新的产品等级麻烦,甚至要在抽象层修改代码
● 适用场景:
- 系统中有多于一个的产品族。而每次只使用其中某一产品族。可以通过配置文件等方式来使得用户可以动态改变产品族,也可以很方便地增加新的产品族。
- 产品等级结构稳定。设计完成之后,不会向系统中增加新的产品等级结构或者删除已有的产品等级结构。
/*针对产品族而不是产品等级结构
*/
#include<iostream>
using namespace std;
//抽象产品等级
class AbstractApple{
public:virtual void showname()=0;
};
class AbstractBanana{
public:virtual void showname()=0;
};
//具体产品等级
//武汉苹果
class AppleFromWhuhan:public AbstractApple{
public:virtual void showname(){cout<<" apple frome whuhan"<<endl;}
};
//上海苹果
class AppleFromShanghai:public AbstractApple{
public:virtual void showname(){cout<<" apple frome shanghai"<<endl;}
};
//武汉香蕉
class BananaFromWhuhan:public AbstractBanana{
public:virtual void showname(){cout<<" banana frome whuhan"<<endl;}
};
//上海香蕉
class BananafromShanghai:public AbstractBanana{
public:virtual void showname(){cout<<"banana frome shanghai"<<endl;}
};
//抽象工厂
class AbstractFactory{
public :virtual AbstractApple*createApple()=0;virtual AbstractBanana*createBanana()=0;};
//武汉工厂
class WhuhanFactory:public AbstractFactory{
public:AbstractApple*createApple(){return new AppleFromWhuhan();}AbstractBanana*createBanana(){return new BananaFromWhuhan();}
};
//上海工厂
class ShanghaiFactory:public AbstractFactory{
public:AbstractApple*createApple(){return new AppleFromShanghai();}AbstractBanana*createBanana(){return new BananafromShanghai();}
};int main(){AbstractFactory*factory=nullptr;AbstractApple*apple=nullptr;AbstractBanana*banana=nullptr;//武汉苹果和香蕉factory=new WhuhanFactory();apple=factory->createApple();banana=factory->createBanana();apple->showname();// apple frome whuhanbanana->showname();// banana frome whuhandelete factory;delete apple;delete banana;//上海苹果和香蕉factory=new ShanghaiFactory();apple=factory->createApple();banana=factory->createBanana();apple->showname();// apple frome shanghaibanana->showname();//banana frome shanghaidelete factory;delete apple;delete banana;
}
相关文章:
设计模式之简单工厂模式、工厂模式、抽象工厂模式
参考: 设计模式笔记 简单工厂模式 ● 将类的创建过程交给工厂类实现,如果需要一个类对象,则直接通过工厂创建一个类。 ● 简单工厂模式不符合开闭原则 ● 适用场景:工厂类负责创建的对象比较少;客户端只知道传入工厂…...
C# 控制台彩色深度打印 工具类
文章目录 前言Nuget 环境安装代码使用打印结果 总结 前言 有时候我们想要靠打印获得程序信息,因为Dubeg模式需要一点一点断点进入进出,但是我们觉得断点运行实在是太慢了,还是直接打印后找结果会好一点。 Nuget 环境安装 想自己写的话可以看…...
Pytorch Tensor维度变换方法
1.torch.reshape()、torch.view()可以调整Tensor的shape 2.torch.unsqueeze(index)可以为Tensor增加一个维度 3.squeeze()可以删减维度 4.expand()扩展维度 5.repeat()维度重复,不常用 6.transpose(dim1, dim2)交换dim1与dim2࿰…...
微信小程序之点击文字文字自动转语音进行播放,微信小程序文字识别转语音播放
需求 一堆题目,题干需要在点击的时候进行语音朗读,不做音频上传,不然不便于维护 解决方案 点击查看微信官方文档:微信同声传译 使用流程 后台配置 mp.weixin.qq.com 设置 > 第三方设置 > 插件管理 小程序插件使用流…...
主动学习、半监督学习、它们之间的区别?
1、主动学习(Active Learning): 含义: 有的时候,有类标的数据比较稀少而没有类标的数据是相当丰富的,但是对数据进行人工标注又非常昂贵,这时候,学习算法可以主动地提出一些标注请…...
linux快速安装Rabbitmq
linux快速安装Rabbitmq 准备yum仓库 # root执行rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.ascrpm --import https://packagecloud.io/rabbitmq/erlang/gpgkeyrpm --import https://packagecloud.io/ra…...
spconv1.2.1库的编译与安装
SpConv是一个稀疏卷积库,在点云相关的深度学习算法中用的比较多。由于目前官方升级到了2.0,然而有些算法(比如审稿人要我复现的Cylinder3D)仍需要用到1.2.1版本,因此本人花了亿点点时间折腾了一下。。。 本机安装cuda…...
java+springboot+mysql企业邮件管理系统
项目介绍: 使用javaspringbootmysql开发的企业邮件管理系统,系统包含超级管理员、管理员、员工角色,功能如下: 超级管理员:管理员管理;员工管理;反馈管理;系统公告;个人…...
[CKA]考试之一个 Pod 封装多个容器
由于最新的CKA考试改版,不允许存储书签,本博客致力怎么一步步从官网把答案找到,如何修改把题做对,下面开始我们的 CKA之旅 题目为: Task 创建一个Pod,名字为kucc1,这个Pod包含4容器ÿ…...
iphone备份用什么软件?好用的苹果数据备份工具推荐!
众所周知,如果要将iPhone的数据跟电脑进行传输备份的话,我们需要用到iTunes这个pc工具。但是对于iTunes,不少人都反映这个软件比较难用,用不习惯。于是,顺应时代命运的iPhone备份同步工具就出现了。那iphone备份用什么…...
一语道破 python 迭代器和生成器
简而言之:迭代器是一个抽象化的概念,在python中表示访问数据集合中元素的一种方式;生成器也是一个抽象化的概念,在python 中,边循环边生成所需数据,是一种时间换空间的方法。从访问数据方式上来看ÿ…...
有哪些开源和非开源的项目管理工具?
开源和非开源项目管理工具各有其特点和优势。下面是一些常见的开源和非开源项目管理工具以及它们的简要介绍。 开源项目管理工具: OpenProject:OpenProject 是一个功能强大、易于使用的开源项目管理工具。它提供了项目计划、任务管理、团队协作、文档管…...
实战 01|「编写互动式界面」
前言 实践是最好的学习方式,技术也如此。 文章目录 前言一、功能需求(一)1、功能需求描述2、知识点3、布局与程序设计 二、功能需求(二)1、功能需求描述2、知识点1)LinearLayout2)RelativeLayou…...
开源社区寻找八月创作之星!你准备好了吗~
活动页面:https://openlab.cosmoplat.com/createStarCampaign-202308卡奥斯开源社区定位打造工业互联网行业顶级开源社区生态平台,为开发者、企业等用户提供代码托管、技术交流/共享、硬件认证/接入、培训认证、大赛活动等服务,目…...
appuploader不是开发者账号
Appuploader是一款可以帮助开发者上传iOS应用到Apple App Store的工具。很多开发者都知道,在上传应用到App Store之前,需要创建开发者账号并获得苹果官方的认证才能进行上传。但是,有些开发者可能并不想去注册开发者账号,或者遇到…...
MySQL - 10、其他命令
描述表结构、使用数据库、设置变量、更改分隔符、导入SQL脚本、退出MySQL的操作: -- 描述表结构 DESCRIBE table_name;-- 使用特定数据库 USE database_name;-- 设置变量 SET variable_name value;-- 更改分隔符 DELIMITER //-- 执行SQL脚本文件 SOURCE /path/to/…...
输入框长度在XSS测试中如何绕过字符长度限制
大家好,这是我编写的第一篇文章,之所以会分享这个故事,是因为我花了几个晚上的时间,终于找到了解决某个问题的方法。故事如下: 几个月前,我被邀请参加一个非公共的漏洞悬赏项目,在初期发现了一些…...
JVM基础篇-直接内存
JVM基础篇-直接内存 什么是直接内存? 直接内存( 堆外内存 ) 指的是 Java 应用程序通过直接方式从操作系统中申请的内存,这块内存不属于jvm 传统方式读取文件 首先会从用户态切换到内核态,调用操作系统函数从磁盘读取文件,读取一部分到操作系统缓冲区…...
【Java可执行命令】(十四)脚本执行工具jrunscript :在命令行环境下交互式执行一些简单的脚本或测试代码片段~
Java可执行命令之jrunscript 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式3.2 启动 jrunscript 直接执行脚本3.3 可选参数:-l < language>3.4 可选参数:-e < script>3.5 可选参数:-f < script file>3.6 注意事项 4️…...
eclipse Java Editor Templates
Window - Preferences - Java - Editor - Templates date ${currentDate:date(yyyy.MM.dd)}...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
