当前位置: 首页 > news >正文

设计模式之简单工厂模式、工厂模式、抽象工厂模式

参考: 设计模式笔记

简单工厂模式

● 将类的创建过程交给工厂类实现,如果需要一个类对象,则直接通过工厂创建一个类。
● 简单工厂模式不符合开闭原则
● 适用场景:工厂类负责创建的对象比较少;客户端只知道传入工厂类的参数,对于如何创建对象不关心

/*
类的创建过程交给工厂类来实现,如果需要一个类的对象,则直接通过工厂创建一个对应的类对象
*/
#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;}

抽象工厂模式(增加产品族方便)

● 产品族:同一产地或者同一产商,功能不同
● 产品等级:功能相同,产地或者产商不同
● 不符合开闭原则,增加新的产品等级麻烦,甚至要在抽象层修改代码
● 适用场景:

  1. 系统中有多于一个的产品族。而每次只使用其中某一产品族。可以通过配置文件等方式来使得用户可以动态改变产品族,也可以很方便地增加新的产品族。
  2. 产品等级结构稳定。设计完成之后,不会向系统中增加新的产品等级结构或者删除已有的产品等级结构。
/*针对产品族而不是产品等级结构
*/
#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;
}

相关文章:

设计模式之简单工厂模式、工厂模式、抽象工厂模式

参考&#xff1a; 设计模式笔记 简单工厂模式 ● 将类的创建过程交给工厂类实现&#xff0c;如果需要一个类对象&#xff0c;则直接通过工厂创建一个类。 ● 简单工厂模式不符合开闭原则 ● 适用场景&#xff1a;工厂类负责创建的对象比较少&#xff1b;客户端只知道传入工厂…...

C# 控制台彩色深度打印 工具类

文章目录 前言Nuget 环境安装代码使用打印结果 总结 前言 有时候我们想要靠打印获得程序信息&#xff0c;因为Dubeg模式需要一点一点断点进入进出&#xff0c;但是我们觉得断点运行实在是太慢了&#xff0c;还是直接打印后找结果会好一点。 Nuget 环境安装 想自己写的话可以看…...

Pytorch Tensor维度变换方法

1.torch.reshape()、torch.view()可以调整Tensor的shape 2.torch.unsqueeze(index)可以为Tensor增加一个维度 3.squeeze()可以删减维度 4.expand&#xff08;&#xff09;扩展维度 5.repeat()维度重复&#xff0c;不常用 6.transpose(dim1, dim2)交换dim1与dim2&#xff0…...

微信小程序之点击文字文字自动转语音进行播放,微信小程序文字识别转语音播放

需求 一堆题目&#xff0c;题干需要在点击的时候进行语音朗读&#xff0c;不做音频上传&#xff0c;不然不便于维护 解决方案 点击查看微信官方文档&#xff1a;微信同声传译 使用流程 后台配置 mp.weixin.qq.com 设置 > 第三方设置 > 插件管理 小程序插件使用流…...

主动学习、半监督学习、它们之间的区别?

1、主动学习&#xff08;Active Learning&#xff09;&#xff1a; 含义&#xff1a; 有的时候&#xff0c;有类标的数据比较稀少而没有类标的数据是相当丰富的&#xff0c;但是对数据进行人工标注又非常昂贵&#xff0c;这时候&#xff0c;学习算法可以主动地提出一些标注请…...

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是一个稀疏卷积库&#xff0c;在点云相关的深度学习算法中用的比较多。由于目前官方升级到了2.0&#xff0c;然而有些算法&#xff08;比如审稿人要我复现的Cylinder3D&#xff09;仍需要用到1.2.1版本&#xff0c;因此本人花了亿点点时间折腾了一下。。。 本机安装cuda…...

java+springboot+mysql企业邮件管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的企业邮件管理系统&#xff0c;系统包含超级管理员、管理员、员工角色&#xff0c;功能如下&#xff1a; 超级管理员&#xff1a;管理员管理&#xff1b;员工管理&#xff1b;反馈管理&#xff1b;系统公告&#xff1b;个人…...

[CKA]考试之一个 Pod 封装多个容器

由于最新的CKA考试改版&#xff0c;不允许存储书签&#xff0c;本博客致力怎么一步步从官网把答案找到&#xff0c;如何修改把题做对&#xff0c;下面开始我们的 CKA之旅 题目为&#xff1a; Task 创建一个Pod&#xff0c;名字为kucc1&#xff0c;这个Pod包含4容器&#xff…...

iphone备份用什么软件?好用的苹果数据备份工具推荐!

众所周知&#xff0c;如果要将iPhone的数据跟电脑进行传输备份的话&#xff0c;我们需要用到iTunes这个pc工具。但是对于iTunes&#xff0c;不少人都反映这个软件比较难用&#xff0c;用不习惯。于是&#xff0c;顺应时代命运的iPhone备份同步工具就出现了。那iphone备份用什么…...

一语道破 python 迭代器和生成器

简而言之&#xff1a;迭代器是一个抽象化的概念&#xff0c;在python中表示访问数据集合中元素的一种方式&#xff1b;生成器也是一个抽象化的概念&#xff0c;在python 中&#xff0c;边循环边生成所需数据&#xff0c;是一种时间换空间的方法。从访问数据方式上来看&#xff…...

有哪些开源和非开源的项目管理工具?

开源和非开源项目管理工具各有其特点和优势。下面是一些常见的开源和非开源项目管理工具以及它们的简要介绍。 开源项目管理工具&#xff1a; OpenProject&#xff1a;OpenProject 是一个功能强大、易于使用的开源项目管理工具。它提供了项目计划、任务管理、团队协作、文档管…...

实战 01|「编写互动式界面」

前言 实践是最好的学习方式&#xff0c;技术也如此。 文章目录 前言一、功能需求&#xff08;一&#xff09;1、功能需求描述2、知识点3、布局与程序设计 二、功能需求&#xff08;二&#xff09;1、功能需求描述2、知识点1&#xff09;LinearLayout2&#xff09;RelativeLayou…...

开源社区寻找八月创作之星!你准备好了吗~

活动页面&#xff1a;https://openlab.cosmoplat.com/createStarCampaign-202308​​​​​​卡奥斯开源社区定位打造工业互联网行业顶级开源社区生态平台&#xff0c;为开发者、企业等用户提供代码托管、技术交流/共享、硬件认证/接入、培训认证、大赛活动等服务&#xff0c;目…...

appuploader不是开发者账号

Appuploader是一款可以帮助开发者上传iOS应用到Apple App Store的工具。很多开发者都知道&#xff0c;在上传应用到App Store之前&#xff0c;需要创建开发者账号并获得苹果官方的认证才能进行上传。但是&#xff0c;有些开发者可能并不想去注册开发者账号&#xff0c;或者遇到…...

MySQL - 10、其他命令

描述表结构、使用数据库、设置变量、更改分隔符、导入SQL脚本、退出MySQL的操作&#xff1a; -- 描述表结构 DESCRIBE table_name;-- 使用特定数据库 USE database_name;-- 设置变量 SET variable_name value;-- 更改分隔符 DELIMITER //-- 执行SQL脚本文件 SOURCE /path/to/…...

输入框长度在XSS测试中如何绕过字符长度限制

大家好&#xff0c;这是我编写的第一篇文章&#xff0c;之所以会分享这个故事&#xff0c;是因为我花了几个晚上的时间&#xff0c;终于找到了解决某个问题的方法。故事如下&#xff1a; 几个月前&#xff0c;我被邀请参加一个非公共的漏洞悬赏项目&#xff0c;在初期发现了一些…...

JVM基础篇-直接内存

JVM基础篇-直接内存 什么是直接内存? 直接内存( 堆外内存 ) 指的是 Java 应用程序通过直接方式从操作系统中申请的内存,这块内存不属于jvm 传统方式读取文件 首先会从用户态切换到内核态&#xff0c;调用操作系统函数从磁盘读取文件&#xff0c;读取一部分到操作系统缓冲区…...

【Java可执行命令】(十四)脚本执行工具jrunscript :在命令行环境下交互式执行一些简单的脚本或测试代码片段~

Java可执行命令之jrunscript 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式3.2 启动 jrunscript 直接执行脚本3.3 可选参数&#xff1a;-l < language>3.4 可选参数&#xff1a;-e < script>3.5 可选参数&#xff1a;-f < script file>3.6 注意事项 4️…...

eclipse Java Editor Templates

​ Window - Preferences - Java - Editor - Templates ​ date ${currentDate:date(yyyy.MM.dd)}...

2026届毕业生推荐的十大降AI率工具推荐榜单

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 把文本原创性予以优化&#xff0c;要从多个维度去着手&#xff1a;对句式的结构开展巧妙的调…...

3个核心技术深度破解Cursor免费限制:AI代码编辑器的无限使用方案

3个核心技术深度破解Cursor免费限制&#xff1a;AI代码编辑器的无限使用方案 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reache…...

大模型热切换功能完整实现指南

如果文章对你有帮助&#xff0c;请点个“关注” 版本&#xff1a;v1.0 日期&#xff1a;2026-04-10 作者&#xff1a;阿财 目录 功能概述核心原理后端实现前端实现测试验证故障排查 1. 功能概述 1.1 什么是热切换 Agent 配置热切换&#xff1a;在不重启服务的情况下&#xf…...

为什么现代PHP项目需要统一的支付解决方案:专业级支付SDK深度解析

为什么现代PHP项目需要统一的支付解决方案&#xff1a;专业级支付SDK深度解析 【免费下载链接】pay 可能是我用过的最优雅的 Alipay/WeChat/Douyin/Unipay/江苏银行 的支付 SDK 扩展包了 项目地址: https://gitcode.com/gh_mirrors/pa/pay 在当今多平台电商和数字服务时…...

常见问题划重点|Google Play Games Level Up 计划

Google Play Games Level Up 计划旨在发掘并奖励玩家体验出色的游戏&#xff0c;提供各种强大的工具和推广资源来助力您的游戏业务蓬勃发展。我们将为您推出有关 Level Up 计划的系列精彩内容&#xff0c;欢迎您关注 #Level Up 计划内容合集。Google Play 始终致力于挖掘那些能…...

机器人跟随算法

REF&#xff1a;基于多机器人路径规划与编队控制的优化研究1. 基础模型RRT&#xff08;快速随机树&#xff09;算法&#xff1a;模拟树的生长过程&#xff0c;起始点为树的根节点&#xff0c;在环境中随机采样作为树的叶节点&#xff0c;从最近节点到目标点的方向上&#xff0c…...

【后端】Easy Rules 进阶:基于注解与工厂模式打造动态规则编排系统

1. Easy Rules 核心机制解析 在业务系统开发中&#xff0c;我们经常遇到需要处理复杂业务规则的场景。传统的硬编码方式会让代码变得臃肿且难以维护&#xff0c;而Easy Rules提供了一种优雅的解决方案。它的核心思想是将业务规则从主流程中解耦&#xff0c;通过声明式的方式定义…...

移动神器RAX3000M路由器变身家庭云之八:解锁无线打印,低成本打造全屋打印中心

1. 为什么需要无线打印解决方案 家里那台老打印机是不是经常让你头疼&#xff1f;明明打印效果还不错&#xff0c;但每次都要用USB线连接电脑才能打印&#xff0c;手机里的文件想打印更是麻烦。我家里就有一台Brother DCP-7055&#xff0c;用了十多年依然坚挺&#xff0c;但每次…...

golang如何实现备忘录模式_golang备忘录模式实现方案

Go中备忘录模式需用非导出结构体封装快照、接口作类型标记&#xff0c;发起者控制Save/Restore&#xff1b;只备份业务字段&#xff0c;避免指针/map共享&#xff1b;限制栈长度并置空引用助GC&#xff1b;测试用reflect.DeepEqual验证隔离性。备忘录模式在 Go 里没有语言原生支…...

LLM API延迟突增300ms?模型token吞吐骤降?——AI原生可观测性四象限诊断法,15分钟定位GPU显存泄漏+KV Cache膨胀根源

第一章&#xff1a;AI原生软件研发的可观测性实践 2026奇点智能技术大会(https://ml-summit.org) AI原生软件的研发范式正从根本上重塑可观测性需求——模型推理延迟、数据漂移、提示工程异常、向量嵌入分布偏移等新型信号&#xff0c;无法被传统APM或日志监控体系有效捕获。可…...