自学设计模式(简单工厂模式、工厂模式、抽象工厂模式)
使用工厂模式来生产某类对象(代码简化且容易维护,类之间有血缘关系,可以通过工厂类进行生产);
简单工厂模式(用于创建简单对象)
对于简单工厂模式,需要的工厂类只有一个;
在工厂类中的公共成员函数来创建所需对象;
#include <bits/stdc++.h>
using namespace std;
// 产品父类
class shape{
public:virtual void cal() = 0;virtual ~shape(){}
}; class triangle:public shape{
public:void cal() override{cout<<"三角形面积";}
};class square:public shape{
public:void cal() override{cout<<"正方形面积";}
};class cycle:public shape{
public:void cal() override{cout<<"圆形面积";}
};// 工厂类
enum class Type:char{triangle , square , cycle
};
class fac{
public:shape* creat_kinds(Type type){shape* ptr = nullptr;switch(type){case Type::triangle:ptr = new triangle;break;case Type::square:ptr = new square;break;case Type::cycle:ptr = new cycle;break;}return ptr;}
};
int main(){fac* cur = new fac;shape* obj = cur->creat_kinds(Type::cycle);obj->cal();return 0;
}
工厂模式
简单工厂模式会违反开放封闭原则 在添加类时需要修改子类、枚举类、工厂类、和判断代码
工厂模式通过创立N个工厂类来解决上述问题(对简单工厂模式解耦合),对已经写好的代码无需修改;
#include <bits/stdc++.h>
using namespace std;
// 产品父类
class shape{
public:virtual void cal() = 0;virtual ~shape(){}
}; class triangle:public shape{
public:void cal() override{cout<<"三角形面积"<<endl;}
};class square:public shape{
public:void cal() override{cout<<"正方形面积"<<endl;}
};class cycle:public shape{
public:void cal() override{cout<<"圆形面积"<<endl;}
};// 工厂类
class fac{
public:virtual shape* creat_kinds() = 0;virtual ~fac(){}
}; class triangle_fac:public fac{
public:shape* creat_kinds(){return new triangle;}~triangle_fac(){cout<<"三角形被析构"; }
};
class square_fac:public fac{
public:shape* creat_kinds(){return new square;}~square_fac(){cout<<"三角形被析构"; }
};class cycle_fac:public fac{
public:shape* creat_kinds(){return new cycle;}~cycle_fac(){cout<<"三角形被析构"; }
};
int main(){fac* cur = new cycle_fac;shape* obj = cur->creat_kinds();obj->cal();delete obj;delete cur;return 0;
}
抽象工厂模式
通过造船,船分为三个模块,船体、武器、动力,三个模块又分为了简易、标准、旗舰三个版本
#include <bits/stdc++.h>
using namespace std;
// 三个抽象类 每个抽象类下三个具体派生类
// 抽象工厂类 一个抽象类 三个派生类
class body{
public:virtual void getbody() = 0;virtual ~body(){}
}; class wood_body:public body{
public:void getbody() override{cout<<"船的船体为<木头>---";}
};class iron_body:public body{
public:void getbody() override{cout<<"船的船体为<钢铁>---";}
};class mental_body:public body{
public:void getbody() override{cout<<"船的船体为<合成金属>---";}
};class weapon{
public:virtual void getweapon() = 0;virtual ~weapon(){}
};class gun_weapon:public weapon{
public:void getweapon() override{cout<<"船的武器为<枪>---" ;}
};class cannon_weapon:public weapon{
public:void getweapon() override{cout<<"船的武器为<炮>---" ;}
};class laser_weapon:public weapon{
public:void getweapon() override{cout<<"船的武器为<激光>---" ;}
};class power{
public:virtual void getpower() = 0;virtual ~power(){}
}; class human_power:public power{
public:void getpower() override{cout<<"船的动力为<手动>---"; }
};class engine_power:public power{
public:void getpower() override{cout<<"船的动力为<内燃机>---"; }
};class nuclear_power:public power{
public:void getpower() override{cout<<"船的动力为<核反应堆>---"; }
};class ship{
private:body* m_body;weapon* m_weapon;power* m_power;
public:ship(body* o_body , weapon* o_weapon , power* o_power):m_body(o_body) , m_weapon(o_weapon) , m_power(o_power){m_body->getbody();m_weapon->getweapon();m_power->getpower(); }~ ship(){delete m_body;delete m_weapon;delete m_power;}
};class fac{
public:virtual ship* get() = 0;~ fac(){}
}; class e_fac:public fac{
public:ship* get() override{ship* cur = new ship(new wood_body , new gun_weapon , new human_power);return cur;}
};class m_fac:public fac{
public:ship* get() override{ship* cur = new ship(new iron_body , new cannon_weapon , new engine_power);return cur;}
};class h_fac:public fac{
public:ship* get() override{ship* cur = new ship(new mental_body , new laser_weapon , new nuclear_power);return cur;}
};int main() {fac* cur = new h_fac;ship* res = cur->get();delete cur;delete res;return 0;
}
描述:首先定义三个抽象类,代表船的三个组成部分(船体、武器、动力);每个抽象类下有三个派生类,分别对应初级船、中级船、高级船所用的对应材料。通过ship类将船的三个部分组成起来,一个工厂抽象类fac,通过工厂抽象类的派生类,结合ship类设置三种规格的船。
相关文章:
自学设计模式(简单工厂模式、工厂模式、抽象工厂模式)
使用工厂模式来生产某类对象(代码简化且容易维护,类之间有血缘关系,可以通过工厂类进行生产); 简单工厂模式(用于创建简单对象) 对于简单工厂模式,需要的工厂类只有一个࿱…...
NFS:使⽤ NFS 为远程客户端提供共享文件系统
写在前面 分享一些 nfs 搭建的笔记考试顺便整理内容涉及 nfs 服务端客户端的搭建配置理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的&…...
2022-kaggle-nlp赛事:Feedback Prize - English Language Learning(超多注释讲解)
2022-kaggle-nlp赛事:Feedback Prize - English Language Learning 零、比赛介绍 比赛地址Feedback Prize - English Language Learning | Kaggle 0.1 比赛目标 写作是一项基本技能。可惜很少学生能够磨练,因为学校很少布置写作任务。学习英语作为第…...

第十三课 宾语从句
文章目录 前言一、宾语从句1、主语及物动词宾语从句2、主语双宾动词间接宾语直接宾语3、主语特定及物动词宾语从句(作宾语)宾补4、主语be某些形容词宾语从句5、动词不定式后面的宾语从句6、动名词后面的宾语从句7、介词后面的宾语从句9、间接引语 前言 一…...

Docker容器与虚拟化技术:GitHub账户注册
目录 一、实验 1.GitHub 一、实验 1.GitHub (1)GitHub是一个面向开源及私有软件项目的托管平台,因为只支持Git作为唯一的版本库格式进行托管,故名GitHub。 (2)官网 GitHub: Let’s build from here …...

thinkphp安装workman
需要加版本,版本太高了不行 composer require topthink/think-worker1.0.*...
L1-036 A乘以B(Python实现) 测试点全过
题目 看我没骗你吧 —— 这是一道你可以在 10 秒内完成的题:给定两个绝对值不超过 100 的整数 A 和 B,输出 A 乘以 B 的值。 输入格式 输入在第一行给出两个整数 A 和 B ( − 100 ≤ A , B ≤ 100 ) A 和 B(−100≤…...
代码随想录第五十三天
代码随想录第五十三天 Leetcode 1143. 最长公共子序列Leetcode 1035. 不相交的线Leetcode 53. 最大子数组和 Leetcode 1143. 最长公共子序列 题目链接: 最长公共子序列 自己的思路:没想出来!!! 正确思路:首先这道题由于是涉及到了两个数组&…...
cmd - 如何在不重启的情况下让修改后的hosts生效
cmd - 如何在不重启的情况下让修改后的hosts生效 亲测有效 一般在修改了hosts文件后,需要重启电脑才能生效;其实可以不通过重启电脑也可以令其生效,方法如下: 打开cmd窗口输入ipconfig /flushdns,然后回车。…...
echarts实现双x轴并且分组滚动效果
var myChart echarts.init(document.getElementById(allOutPut1));var option {legend: {itemHeight: 10, // 图例icon高度itemWidth: 16, // 图例icon宽度icon:rect,//设置为矩形top:2%,right:10%,},tooltip: {trigger: axis,axisPointer: {type: shadow},textStyle: {fontS…...

UE4 地形编辑基础知识 学习笔记
之前自己写过这样的功能,今天看到一个UE现成的 点击地形,选择样条 按住CTRL键点击屏幕中某一个点会在场景内生成一个这样的图标 再点两次,会生成B样条的绿线条 点击号再选择一个模型,会生成对应的链条状的mesh 拉高最远处的一个图…...

AcWing算法提高课-5.5.2最大公约数
宣传一下 算法提高课整理 CSDN个人主页:更好的阅读体验 原题链接 题目描述 给定整数 N N N,求 1 ≤ x , y ≤ N 1 \le x,y \le N 1≤x,y≤N 且 gcd ( x , y ) \gcd(x,y) gcd(x,y) 为素数的数对 ( x , y ) (x,y) (x,y) 有多少对。 输入格式 输…...
Kubernetes-CKA考题详解
Kubernetes-CKA考题详解 考前须知:考试环境说明第一题:RBAC(4%)第二题:指定node设置为不可用(4%)第三题:升级kubernetes节点(7%)第四题:etcd备份还原(7%)第五题:创建NetworkPolicy(7%)第六题:创建svc(7%)第七题:创建ingress资源(7%)第八题:扩展deployme…...

不同版本.net引用同一个项目
项目文件.csproj文件内容如下: 重点是:不能有其他的 netstandard2;net40;net45;net46;net6 <Project Sdk"Microsoft.NET.Sdk"><PropertyGroup><TargetFrameworks>netstandard2;net40;net45;net46;net6</TargetFrame…...

软件开发企业SDL安全培训案例
1.背景 随着计算机技术的发展、internet及mobile应用的普遍使用,软件安全像功能、性能、稳定性一样是计算机系统的一个非常重要部分。没有安全的软件,任何美好的功能都是徒劳的,没有安全的软件,公司的机密数据、客户隐私、系统的可靠性都得不到保障.如何有效评估、开发安全、可…...
ide-eval-resetter jar包下载、源码、使用介绍
如果你在找ide-eval-resetter插件,这里告诉你,2021.3版本开始该插件正式失效。 如果你安装的JB产品版本低于2021.3版本,你确定要找ide-eval-resetter,下面提供相关链接希望对你有帮助。 ide-eval-resetter源码: Githu…...
数据压缩算法一览
文章首发地址 Huffman编码: Huffman编码是一种基于字符频率的无损压缩算法。它将出现频率较高的字符用较短的编码表示,出现频率较低的字符用较长的编码表示,从而实现压缩。Lempel-Ziv-Welch (LZW): LZW是一种基于字典的无损压缩算…...

使用Rust开发命令行工具
生成二进制文件,将其扔到环境变量的path下即可~ 用rust打造实时天气命令行工具[1] 找到合适的API 使用该api[2] 如请求 api.openweathermap.org/data/2.5/weather?qBeijing&appidyour_key: { "coord": { "lon": 116.3972, "lat&quo…...

CentOS中Oracle11g进程有哪些
最近遇到Oracle数据库运行过程实例进程由于某种原因导致中止的问题,专门看了下正常Oracle数据库启动后的进程有哪些,查阅资料了解了下各进程的作用,记录如下。 oracle 3032 1 0 07:36 ? 00:00:00 ora_pmon_orcl oracle …...

WebRTC之FEC前向纠错协议
FEC前向纠错用于丢包恢复,对媒体包进行异或或其他算法生成冗余包进行发送。如果接收端出现丢包,可以通过冗余包恢复出原始的媒体包。FEC的代价是增加码率带宽,所以一般会根据网络状况、丢包率来动态调整FEC冗余系数,也会结合NACK/…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...

android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...