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

GO抽象工厂模式

既然工厂模式每个产品都需要实现对应的工厂类去生成相关实例,提取产品的共性,提高代码的内聚性,
就是抽象工厂模式要干的。在抽象工厂中,依然是不同产品对应不同的工厂类,但可以尽可能将具有相同共性的产品类别合在一起,
从而提高了内聚性。但同时也带来一些问题,比如修改产品类,可能涉及到对应的工厂类都需要改动,OCP原则有没有很好的遵守,
而且通过更加地抽象化,也增加了代码的理解难度。

type OrderMainDAO interface {SaveOrderMain()
}//OrderDetailDAO 为订单详情纪录
type OrderDetailDAO interface {SaveOrderDetail()
}//DAOFactory DAO 抽象模式工厂接口
type DAOFactory interface {CreateOrderMainDAO() OrderMainDAOCreateOrderDetailDAO() OrderDetailDAO
}// RDBMainDAO  为关系型数据库的OrderMainDAO实现
type RDBMainDAO struct{}func (*RDBMainDAO) SaveOrderMain() {fmt.Print("rdb main save\n")
}type RDBDetailDAO struct{}func (*RDBDetailDAO) SaveOrderDetail() {fmt.Print("rdb detail save\n")
}//RDBDAOFactory 是RDB 抽象工厂实现
type RDBDAOFactory struct{}func (*RDBDAOFactory) CreateOrderMainDAO() OrderMainDAO {return &RDBMainDAO{}
}func (*RDBDAOFactory) CreateOrderDetailDAO() OrderDetailDAO {return &RDBDetailDAO{}
}//XMLMainDAO XML存储
type XMLMainDAO struct{}//SaveOrderMain ...
func (*XMLMainDAO) SaveOrderMain() {fmt.Print("xml main save\n")
}//XMLDetailDAO XML存储
type XMLDetailDAO struct{}// SaveOrderDetail ...
func (*XMLDetailDAO) SaveOrderDetail() {fmt.Print("xml detail save")
}//XMLDAOFactory 是RDB 抽象工厂实现
type XMLDAOFactory struct{}func (*XMLDAOFactory) CreateOrderMainDAO() OrderMainDAO {return &XMLMainDAO{}
}func (*XMLDAOFactory) CreateOrderDetailDAO() OrderDetailDAO {return &XMLDetailDAO{}
}测试方法
package abstractfactoryimport "testing"func getMainAndDetail(factory DAOFactory) {factory.CreateOrderMainDAO().SaveOrderMain()factory.CreateOrderDetailDAO().SaveOrderDetail()
}func ExampleRdbFactory() {var factory DAOFactoryfactory = &RDBDAOFactory{}getMainAndDetail(factory)
}func TestRDBFactory(t *testing.T) {var factory DAOFactoryfactory = &RDBDAOFactory{}getMainAndDetail(factory)
}func TestXMLDAOFactory(t *testing.T) {var factory DAOFactoryfactory = &XMLDAOFactory{}getMainAndDetail(factory)
}

相关文章:

GO抽象工厂模式

既然工厂模式每个产品都需要实现对应的工厂类去生成相关实例,提取产品的共性,提高代码的内聚性, 就是抽象工厂模式要干的。在抽象工厂中,依然是不同产品对应不同的工厂类,但可以尽可能将具有相同共性的产品类别合在一起…...

Linux 磁盘/分区/修复 命令

目录 1. lsblk(list block devices) 2. fdisk(fragment disk) 3. gdisk 4. mkfs(make filesystem) 5. df(display file-system disk space usage) 6. du 7. fsck(file-sy…...

php一句话木马免杀

php一句话木马免杀 针对于php一句话木马做免杀: 利用php动态函数的特性,将危险函数拆分成字符,最终使用字符串拼接的方式,然后重新拼接,后加括号执行代码,并且可以使用花指令进行包装,如无限i…...

深度学习人体跌倒检测 -yolo 机器视觉 opencv python 计算机竞赛

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习的人体跌倒检测算法研究与实现 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满…...

轻松整理文件夹,将视频文件全部归类到另一个文件夹!

如果你需要整理文件夹中的文件,将同一类别的文件归纳到一起,可以更加方便地管理和查找。现在,我们有一个简单而实用的方法,可以将文件夹中的所有视频文件归类到另一个文件夹中,让你的文件管理更加有序和高效。 首先&am…...

存储服务器特征是什么

存储服务器和普通服务器是有差别的,配置方式不同,因为存储服务器是为特定目标设计的,通常存储服务器是独立的单元,大多数时候是被设计成4U机架式,存储服务器一般是单机运作的,不与其他服务器连接。今天小编…...

Conditional GAN

Text-to-Image 对于根据文字生成图像的问题,传统的做法就是训练一个NN,然后输入一段文字,输出对应一个图片,输出图片与目标图片越接近越好。存在的问题就是,比如火车对应的图片有很多张,如果用传统的NN来训…...

OOM问题排查+Jvm优化

OOM问题排查: 1、top命令:查看cpu和内存的使用情况。 2、jstat命令:查看YGC和FGC情况,一般都是老年代不够用。导致OOM 3、jmap命令: 查看哪个类的实例过多,以每个类占用多少了内存。4、jstack 查看线程与线程之间的阻…...

链表:C++实现

引言: 链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。相比于数组,链表具有动态性和灵活性,可以高效地进行插入和删除操作,但是查找操作的时间复杂度较…...

使用JMX监控ZooKeeper和Kafka

JVM 默认会通过 JMX 的方式暴露基础指标,很多中间件也会通过 JMX 的方式暴露业务指标,比如 Kafka、Zookeeper、ActiveMQ、Cassandra、Spark、Tomcat、Flink 等等。掌握了 JMX 监控方式,就掌握了一批程序的监控方式。本节介绍 JMX-Exporter 的使用,利用 JMX-Exporter 把 JMX…...

蓝桥等考C++组别七级008

第一部分:选择题 1、C++ L7 (15分) 在判断是否满足循环条件之前,至少执行循环体语句一次的是哪种循环结构?( ) for循环while循环do-while循环以上都不是正确答案:C 2、C++ L7 (15分) 执行以下程序,会输出几个“*”?( ) for(int i = 0; i <= 10; i++){…...

sam和mobilesam导出预处理的onnx

一、前言 sam或者mobilesam的python推理都存在一些前处理,如下所示: sam.to(device=cuda) predictor = SamPredictor(sam) predictor.set_image(image) image_embedding = predictor.get_image_embedding().cpu().numpy() checkpoint = "./weights/mobile_sam.pt"…...

开源与闭源:大模型发展的双重走向

目录 前言开源和闭源的优劣势比较开源的优势闭源的优势 开源和闭源对大模型技术发展的影响对技术发展的影响对数据共享的影响对业务拓展的影响 开源与闭源的商业模式比较开源的商业模式闭源的商业模式 处在大模型洪流中&#xff0c;向何处去&#xff1f;结语 前言 随着人工智能…...

c# 逆变 / 协变

个人理解&#xff1a; 1. 逆变in向上兼容类 2. 协变out向下兼容类 在面向对象编程中&#xff0c;尤其是使用泛型时&#xff0c;in和out关键字用于限制类型参数的协变性和逆变性。 in关键字&#xff08;逆变&#xff09;&#xff1a; in关键字用于标记泛型类型参数的逆变性。…...

electron使用better-sqlite3打包失败(electron打包有进程没有界面)

remove *\chrome_100_percent.pak: Access is denied. 解决&#xff1a; 管理员权限执行&#xff1a;taskkill /IM 你的进程名.exe /F&#xff0c;再次执行build electron使用better-sqlite3打包后有进程没有界面 原因是代码及依赖包安装有误&#xff0c;模块丢失。主要分享的…...

2.6文件服务器

2.6文件服务器 一、Ftp 介绍 文件传输协议&#xff08;File Transfer Protocol&#xff0c;FTP&#xff09;&#xff0c;基于该协议FTP客户端与服务端可以实现共享文 件、上传文件、下载文件。 FTP 基于TCP协议生成一个虚拟的连接&#xff0c;主要用于控制FTP连接信息&#x…...

【C++ 学习 ㊴】- 详解 C++ 的 I/O 流

目录 一、C 的 I/O 流 二、C 的标准 I/O 流 三、C 的文件 I/O 流 一、C 的 I/O 流 C 语言有一套完成数据读写&#xff08;I/O&#xff09;的解决方案&#xff1a; 使用 scanf()、gets() 等函数从键盘读取数据&#xff0c;使用 printf()、puts() 等函数向屏幕输出数据&#…...

js算法面试题(附答案)

js算法面试题十道 两数之和 题目&#xff1a;给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那两个整数&#xff0c;并返回他们的数组下标。 function twoSum(nums, target) {const map new Map();for (let i 0; i < nums.leng…...

2023 年戴森设计大奖得主是谁?给大楼降温、争取救援机会

2023 年戴森设计大奖得主是谁&#xff1f;给大楼降温、争取救援机会 ​编辑拉风的极客2023/11/22 摘要 当今社会除了持续不断对科技创新保持注目&#xff0c;还有很多年轻发明家为了实际场景的难题提供解决方案。 11 月 15 日&#xff0c;2023 年戴森设计大奖国际大奖名单正…...

〖大前端 - 基础入门三大核心之JS篇㊲〗- DOM改变元素节点的css样式、HTML属性

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…...

CXPatcher:让Mac上的Windows游戏飞起来的性能优化神器![特殊字符]

CXPatcher&#xff1a;让Mac上的Windows游戏飞起来的性能优化神器&#xff01;&#x1f680; 【免费下载链接】CXPatcher A patcher to upgrade Crossover dependencies and improve compatibility 项目地址: https://gitcode.com/gh_mirrors/cx/CXPatcher 还在为Mac上运…...

如何高效解决游戏Mod加载问题:MelonLoader实战解决方案大全

如何高效解决游戏Mod加载问题&#xff1a;MelonLoader实战解决方案大全 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader MelonLo…...

Emby.CustomCssJS:深度定制你的媒体服务器界面架构

Emby.CustomCssJS&#xff1a;深度定制你的媒体服务器界面架构 【免费下载链接】Emby.CustomCssJS Easy to manage your Custom JavaScript and Css to modify Emby 项目地址: https://gitcode.com/gh_mirrors/em/Emby.CustomCssJS Emby.CustomCssJS是一个专为Emby媒体服…...

05华夏之光永存・开源:黄大年茶思屋榜文保姆级全落地解法「31期 5题」多模态高维数据解耦可控生成+AI极致视频压缩

05华夏之光永存・开源&#xff1a;黄大年茶思屋榜文保姆级全落地解法「31期 5题」 【多模态高维数据解耦可控生成AI极致视频压缩&#xff5c;纯全落地全裸参数开源上机直接跑版】 全落地・全参数开源・保姆级上机可跑版 一、摘要 多模态特征可控生成、视频智能压缩领域&#xf…...

专业级AI音频处理实践指南:OpenVINO插件在Audacity中的本地化创新应用

专业级AI音频处理实践指南&#xff1a;OpenVINO插件在Audacity中的本地化创新应用 【免费下载链接】openvino-plugins-ai-audacity A set of AI-enabled effects, generators, and analyzers for Audacity. 项目地址: https://gitcode.com/gh_mirrors/op/openvino-plugins-ai…...

Arm Cortex-R82调试寄存器架构与实战应用

1. Cortex-R82调试寄存器架构解析在嵌入式系统开发领域&#xff0c;调试寄存器是硬件调试的核心基础设施。Arm Cortex-R82作为面向实时计算的高性能处理器&#xff0c;其调试寄存器设计体现了三个关键特性&#xff1a;精确的异常触发机制、多级安全权限控制和灵活的上下文匹配能…...

Simulink仿真结果想实时画图?手把手教你用MATLAB Function调用plot3做动态3D可视化

Simulink仿真结果实时3D可视化&#xff1a;MATLAB Function模块高级绘图实战 在工程仿真领域&#xff0c;数据的可视化呈现往往比原始数字更能揭示系统行为的本质。传统Simulink Scope模块虽然能满足基本波形显示需求&#xff0c;但当面对复杂的三维动态数据时&#xff0c;其局…...

基于MCP协议与Twilio构建AI智能语音呼叫系统实战指南

1. 项目概述&#xff1a;Famulor-MCP&#xff0c;一个让AI替你打电话的智能工具如果你和我一样&#xff0c;对AI语音助手和自动化流程充满兴趣&#xff0c;同时又觉得市面上的方案要么太复杂&#xff0c;要么不够灵活&#xff0c;那么Famulor-MCP这个项目绝对值得你花时间研究。…...

别再折腾Docker了!用桌面版AnythingLLM,5分钟搞定你的第一个私有知识库助手

桌面版AnythingLLM&#xff1a;零门槛打造个人知识库助手的极简指南 你是否曾经想拥有一个能随时解答你私人文档问题的AI助手&#xff0c;却被复杂的Docker命令和云服务器配置劝退&#xff1f;现在&#xff0c;这一切变得前所未有的简单。桌面版AnythingLLM彻底改变了游戏规则—…...

从‘马赛克’里找边界:聊聊谷歌Boundary Attention模型如何拯救低画质图片

从模糊到清晰&#xff1a;Boundary Attention如何重塑低画质图像的边缘魔法 手机相册里总躺着几张模糊的老照片——祖母年轻时的笑脸只剩下色块轮廓&#xff0c;旅行时抓拍的风景照因为光线不足而颗粒感明显&#xff0c;甚至昨天收到的证件照电子版也因压缩过度变得边缘发虚。这…...