设计模式之简单工厂模式、工厂模式、抽象工厂模式
参考: 设计模式笔记
简单工厂模式
● 将类的创建过程交给工厂类实现,如果需要一个类对象,则直接通过工厂创建一个类。
● 简单工厂模式不符合开闭原则
● 适用场景:工厂类负责创建的对象比较少;客户端只知道传入工厂类的参数,对于如何创建对象不关心
/*
类的创建过程交给工厂类来实现,如果需要一个类的对象,则直接通过工厂创建一个对应的类对象
*/
#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)}...
一天做出:鸿蒙 + AI 游戏 Demo
子玥酱 (掘金 / 知乎 / CSDN / 简书 同名) 大家好,我是 子玥酱,一名长期深耕在一线的前端程序媛 👩💻。曾就职于多家知名互联网大厂,目前在某国企负责前端软件研发相关工作,主要聚…...
终极指南:如何用IDE Eval Resetter轻松重置JetBrains试用期
终极指南:如何用IDE Eval Resetter轻松重置JetBrains试用期 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 还在为JetBrains IDE试用期到期而烦恼吗?想继续使用IntelliJ IDEA、PyCharm或We…...
Bytenode加载器文件原理:深入理解CommonJS与ES模块的差异
Bytenode加载器文件原理:深入理解CommonJS与ES模块的差异 【免费下载链接】bytenode A minimalist bytecode compiler for Node.js 项目地址: https://gitcode.com/gh_mirrors/by/bytenode Bytenode作为一款轻量级的Node.js字节码编译器,通过将Ja…...
从Linux驱动本质到IgH EtherCAT完整流程:一篇彻底打通驱动、配置、库、硬件的硬核博客
在做EtherCAT运动控制、机械臂开发、机器人控制系统时,几乎所有人都会遇到一连串灵魂拷问:- Linux驱动到底是什么?- 为什么用户程序不能直接操作硬件?- ethercat.conf 绑定MAC、设置 generic 到底有什么用?- 用户程序…...
Windows平台nRF Connect SDK(NCS)一站式环境配置与避坑指南
1. 为什么选择nRF Connect SDK开发? 如果你正在寻找一款适合物联网设备开发的工具链,nRF Connect SDK(简称NCS)绝对值得考虑。作为Nordic Semiconductor推出的官方开发套件,它基于Zephyr实时操作系统,特别适…...
Windows系统优化终极指南:揭秘WinUtil如何让你的电脑焕然一新
Windows系统优化终极指南:揭秘WinUtil如何让你的电脑焕然一新 【免费下载链接】winutil Chris Titus Techs Windows Utility - Install Programs, Tweaks, Fixes, and Updates 项目地址: https://gitcode.com/GitHub_Trending/wi/winutil 你是否厌倦了每次重…...
AgentCPM本地知识库增强方案:基于向量数据库的精准信息检索
AgentCPM本地知识库增强方案:基于向量数据库的精准信息检索 你有没有遇到过这样的情况?用大模型写一份行业分析报告,它给出的观点虽然通顺,但总感觉隔靴搔痒,缺乏对行业内部术语、历史数据和特定公司情况的深度洞察。…...
知识的基本特性:相对正确性、不确定性与可表示性
“知识”并不是对客观世界的简单照搬,也不是永远不变的绝对真理。它是在认识、概括、组织和应用过程中形成的结果,因此既具有稳定性,也具有条件性。理解知识的基本特性,有助于进一步理解:为什么知识需要表示࿰…...
UnrealPakViewer终极指南:如何快速分析虚幻引擎Pak文件资源
UnrealPakViewer终极指南:如何快速分析虚幻引擎Pak文件资源 【免费下载链接】UnrealPakViewer 查看 UE4 Pak 文件的图形化工具,支持 UE4 pak/ucas 文件 项目地址: https://gitcode.com/gh_mirrors/un/UnrealPakViewer 你是否曾经面对数十GB的虚幻…...
[AI/向量数据库/GUI] Attu : Milvus 的图形化与一体化管理工具涎
前言 在使用 kubectl get $KIND -o yaml 查看 k8s 资源时,输出结果中包含大量由集群自动生成的元数据(如 managedFields、resourceVersion、uid 等)。这些信息在实际复用 yaml 清单时需要手动清理,增加了额外的工作量。 使用 kube…...
