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

news2024/9/27 14:40:23

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. 代码可维护性

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

拓展

添加

在此处切换风格

效果

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

系统架构设计师 - 案例特训专题 - 数据库设计篇

案例特训专题 - 数据库设计篇 数据库设计篇规范化与反规范化 ★★★规范化 - 范式反规范化 数据库索引数据库视图数据库分区分表分库分区分区的常见方式 分表分库 分布式数据库 ★★★NoSQL ★★★其他数据库扩展知识 ★★★数据库性能优化集中式数据库优化分布式数据库优化 大…

Thingsboard规则链:Related Device Attributes节点详解

引言 在物联网(IoT)领域,Thingsboard作为一款强大的物联网平台,其规则链功能为企业提供了高度定制化的数据处理和自动化控制方案。其中,Related Device Attributes节点是一个特别实用的组件,它能够访问和操…

sql server每天定时执行sql语句

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

超全攻略|手把手带你0经验转行产品经理

▌想入行,你需要先知道怎么才能走得更顺利 现在,如果有人问我,说重新回答大学毕业,刚要入行产品经理的时候,知道哪些事情,能让自己在后面的产品经理生涯中走的更顺利。 ❓是知道面试的套路,能…

PatrOwl:一款开源可扩展的安全协调运营平台

关于PatrOwl PatrOwl是一款开源可扩展的安全协调运营平台,广大研究人员可以使用该工具完成组织内部的安全协调运营。 该工具是一种可扩展、免费且开源的解决方案,用于协调安全操作。其中的PatrowlManager是前端应用程序,用于管理资产、实时审…

一文读懂常见的几种 LangChain 替代品,看到就是赚到!!

前言 在 LLM (大规模语言模型)应用开发领域,开源框架扮演着至关重要的角色,为广大开发者提供了强大的工具支持。作为这一领域的领军者,LangChain 凭借其创新设计和全面功能赢得了广泛赞誉。但与此同时,一些…

小程序开发平台源码系统 各行各业适用的小程序开的平台 带完整的安装代码包以及搭建部署教程

系统概述 本系统采用模块化设计,包含前端展示层、后端逻辑处理层、数据库存储层以及管理后台等多个核心组件。前端展示层负责小程序的界面设计与交互体验;后端逻辑处理层则负责数据处理、业务逻辑实现及与第三方服务的对接;数据库存储层用于…

如火似茶的AI Bots到底有什么现实意义呢?

你好,我是三桥君 自AIGC潮流兴起以来,基于自注意力机制的大模型成为资本市场疯狂炒作的对象。然而,经过一年多的狂热之后,市场逐渐回归理性。这时候会有人担心,大模型是否会像元宇宙、Web 3.0,甚至比特币那…

低空经济腾飞,无人机飞手人才培养先行

低空经济的腾飞为无人机飞手人才的培养提出了迫切需求,并且这一领域的发展已经引起了广泛的关注。以下是对“低空经济腾飞,无人机飞手人才培养先行”的详细分析: 一、低空经济的腾飞背景 低空经济作为新兴的经济形态,正以前所未…

如何搭建适合自己的数据中台?六步法

数据中台是企业数据价值实现的能力框架,包括数据集成、数据开发、数据管理、数据服务、数据资产运营等能力,是企业业务数据化的承载体,是企业业务通过数据视角的一种呈现,担负了企业数字化所需的核心综合数据能力。但由于数据中台…

fastzdp_redis第一次开发, 2024年9月26日, Python操作Redis零基础快速入门

提供完整录播课 安装 pip install fastzdp_redisPython连接Redis import redis# 建立链接 r redis.Redis(hostlocalhost, port6379, db0)# 设置key r.set(foo, bar)# 获取key的值 print(r.get(foo))RESP3 支持 简单的理解: 支持更丰富的数据类型 参考文档: https://blog.c…

Sublime Text4的下载安装以及汉化

sublime官网:https://www.sublimetext.com/ 按照指示一步步操作即可 汉化操作: 等一会就会弹出搜索框, 帮助菜单这里可以切换语言,

OpenAi以及Dify结合生成Ai模型

文章目录 1、Dify介绍2、使用 Dify3、部署Docker1.系统要求2.系统虚拟化3.下载docker 4、安装WSL1.检查是否已经安装 五、访问系统六、添加模型 1、Dify介绍 Dify官方地址。 Dify 是一个开源的 LLM 应用开发平台。其直观的界面结合了 AI 工作流、RAG 管道、Agent、模型管理、…

HOJ网站开启https访问 申请免费SSL证书 部署证书详细操作指南

https://console.cloud.tencent.com/ 腾讯云用户 登录控制台 右上角搜SSL 点击 SSL证书 进入链接 点申请 免费证书 有效期3个月 (以后每三个月申请一次证书 上传) 如果是腾讯云申请的域名 选 自动DNS验证 自动添加验证记录 如果是其他平台申请域…

利士策分享,快钱诱惑与稳健之道:探索财富积累的两种路径

利士策分享,快钱诱惑与稳健之道:探索财富积累的两种路径 在这个瞬息万变的时代,面对“赚快钱”的即时诱惑与“稳健的长远赚钱方式”的持久魅力,我们不禁要深思:在追求财富的道路上,哪一种方式更为明智&…

图神经学习笔记

图神经网络基础 图神经网络用于挖掘事物的“普遍联系”,理解原理、应用技术。本文汇总图神经网络相关介绍和基础模型。 图及特性 图是由顶点和边组成的,如下图左所示。一般图中的顶点表示实体对象(比如一个用户、一件商品、一辆车、一张银行…

Spring RestTemplate 升级 WebClient 导致 OutOfMemoryError

Spring Boot是 Java 企业应用程序的一个非常流行的框架。与内部或外部应用程序集成的一种常见方法是通过 HTTP REST 连接。我们正在从RestTemplate升级到基于 Java NIO 的WebClient,它可以通过允许在调用 REST 服务端点时进行并发来显著提高应用程序性能。WebClient…

Windows环境部署Oracle 11g

Windows环境部署Oracle 11g 1.安装包下载2. 解压安装包3. 数据库安装3.1 执行安装脚本3.2 电子邮件设置3.3 配置安装选项3.4 配置系统类3.5 选择数据库安装类型3.6 选择安装类型3.7 数据库配置3.8 确认安装信息3.9 设置口令 Oracle常用命令 2023年10月中旬就弄出大致的文章&…

【Linux学习】【Ubuntu入门】2-1-1 vim编辑器设置

设置TAB键为4字节及显示行号 VIM编辑器默认TAB键为8空格,改为4空格 输入命令sudo vi /etc/vim/vimrc回车后输入密码按键盘下键到最后,按下“a”进入编辑模式,输入set ts4设置为4空格下一行输入set nu显示行号

华为HarmonyOS灵活高效的消息推送服务(Push Kit) -- 7 推送卡片刷新消息

场景介绍 如今衣食住行娱乐影音应用占据了大多数人的手机,一部手机可以满足日常大多需求,但对需要经常查看或进行简单操作的应用来说,总需要用户点开应用体验较繁琐。针对此种场景,HarmonyOS提供了Form Kit(卡片开发服…