熟悉各类游戏设计模式的用途与限制,如 factory、strategy、mvc、object pool 等
良好的系统分析与设计能力要求开发者熟悉并正确运用各种设计模式来解决特定问题。设计模式是一种针对特定问题的通用解决方案,可提高代码的可复用性、可维护性和可扩展性。以下是对一些常见游戏设计模式的详细分析,包括其用途、限制和代码示例。
一、工厂模式(Factory)
1. 概述
工厂模式用于封装对象的创建逻辑,避免直接使用 new
创建对象,方便后续扩展和维护。
2. 用途
- 简化对象创建过程。
- 解耦对象的创建与使用。
- 动态创建不同类型的对象。
3. 限制
- 如果种类较多,可能导致工厂类逻辑复杂。
- 不适用于变化很少的对象类型。
4. 代码示例
简单工厂
public interface IEnemy
{void Attack();
}public class Orc : IEnemy
{public void Attack() => Debug.Log("Orc attacks!");
}public class Goblin : IEnemy
{public void Attack() => Debug.Log("Goblin attacks!");
}public static class EnemyFactory
{public static IEnemy CreateEnemy(string type){return type switch{"Orc" => new Orc(),"Goblin" => new Goblin(),_ => throw new ArgumentException("Invalid enemy type")};}
}// 使用
IEnemy orc = EnemyFactory.CreateEnemy("Orc");
orc.Attack();
二、策略模式(Strategy)
1. 概述
策略模式定义了一系列算法,将它们封装起来,使它们可以互相替换而不影响客户端。
2. 用途
- 动态选择算法或行为。
- 实现具有多种行为的游戏角色或 AI。
3. 限制
- 增加了策略类的数量。
- 客户端需要了解所有策略类。
4. 代码示例
public interface IAttackStrategy
{void Execute();
}public class MeleeAttack : IAttackStrategy
{public void Execute() => Debug.Log("Melee Attack!");
}public class RangedAttack : IAttackStrategy
{public void Execute() => Debug.Log("Ranged Attack!");
}public class Character
{private IAttackStrategy _attackStrategy;public void SetAttackStrategy(IAttackStrategy strategy){_attackStrategy = strategy;}public void Attack(){_attackStrategy?.Execute();}
}// 使用
Character character = new Character();
character.SetAttackStrategy(new MeleeAttack());
character.Attack();character.SetAttackStrategy(new RangedAttack());
character.Attack();
三、模型-视图-控制器(MVC)
1. 概述
MVC 模式将应用程序分为三部分:
- Model:处理数据和逻辑。
- View:显示数据和用户界面。
- Controller:处理用户输入并更新 Model 和 View。
2. 用途
- 解耦业务逻辑和界面。
- 便于团队分工(逻辑与界面开发可同时进行)。
3. 限制
- 增加代码复杂度。
- 小型项目可能不需要严格遵循。
4. 代码示例
// Model
public class PlayerModel
{public int Health { get; set; } = 100;
}// View
public class PlayerView : MonoBehaviour
{public void UpdateHealth(int health){Debug.Log($"Player Health: {health}");}
}// Controller
public class PlayerController
{private readonly PlayerModel _model;private readonly PlayerView _view;public PlayerController(PlayerModel model, PlayerView view){_model = model;_view = view;}public void TakeDamage(int damage){_model.Health -= damage;_view.UpdateHealth(_model.Health);}
}// 使用
PlayerModel model = new PlayerModel();
PlayerView view = new PlayerView();
PlayerController controller = new PlayerController(model, view);controller.TakeDamage(10);
四、对象池模式(Object Pool)
1. 概述
对象池模式通过重复使用对象而非频繁创建和销毁对象,提高性能。
2. 用途
- 需要频繁创建和销毁的对象(如子弹、敌人等)。
- 性能敏感的场景。
3. 限制
- 池大小管理不当可能浪费内存或影响性能。
- 不适合生命周期复杂的对象。
4. 代码示例
using System.Collections.Generic;
using UnityEngine;public class ObjectPool<T> where T : new()
{private readonly Stack<T> _pool = new Stack<T>();public T Get(){return _pool.Count > 0 ? _pool.Pop() : new T();}public void Release(T obj){_pool.Push(obj);}
}// 示例:子弹管理
public class Bullet : MonoBehaviour
{public void Shoot(){Debug.Log("Bullet fired!");}
}public class BulletManager : MonoBehaviour
{private readonly ObjectPool<Bullet> _bulletPool = new ObjectPool<Bullet>();public Bullet GetBullet(){return _bulletPool.Get();}public void ReleaseBullet(Bullet bullet){_bulletPool.Release(bullet);}
}// 使用
BulletManager manager = new BulletManager();
Bullet bullet = manager.GetBullet();
bullet.Shoot();
manager.ReleaseBullet(bullet);
总结
设计模式 | 用途 | 优点 | 缺点 |
---|---|---|---|
Factory | 动态创建不同类型的对象。 | 简化对象创建,便于扩展。 | 增加了工厂类的复杂性。 |
Strategy | 动态替换算法或行为。 | 易于扩展,降低耦合。 | 策略类数量较多。 |
MVC | 分离逻辑与界面,适合大型项目。 | 提高代码清晰度,便于团队协作。 | 小型项目显得过于复杂。 |
Object Pool | 提高对象复用性,减少创建和销毁的性能开销。 | 提高性能,减少内存分配频率。 | 池大小管理需要优化,不适合生命周期复杂的对象。 |
通过掌握这些设计模式,可以更高效地开发和维护游戏项目,满足不同的需求场景,同时为后期的扩展和优化打下良好的基础。
相关文章:
熟悉各类游戏设计模式的用途与限制,如 factory、strategy、mvc、object pool 等
良好的系统分析与设计能力要求开发者熟悉并正确运用各种设计模式来解决特定问题。设计模式是一种针对特定问题的通用解决方案,可提高代码的可复用性、可维护性和可扩展性。以下是对一些常见游戏设计模式的详细分析,包括其用途、限制和代码示例。 一、工厂…...

【RabbitMQ高级篇】消息可靠性问题(1)
目录 1.消息可靠性 1.1.生产者消息确认 1.1.1.修改配置 1.1.2.定义Return回调 1.1.3.定义ConfirmCallback 1.2.消息持久化 1.2.1.交换机持久化 1.2.2.队列持久化 1.2.3.消息持久化 1.3.消费者消息确认 1.3.1.演示none模式 1.3.2.演示auto模式 1.4.消费失败重试机制…...

ASP.NET |日常开发中常见问题归纳讲解
ASP.NET |日常开发中常见问题归纳讲解 前言一、性能问题1.1 数据库访问性能1.2 视图状态(在ASP.NET Web Forms 中) 二、安全问题2.1 SQL 注入2.2 跨站脚本攻击(XSS) 三、状态管理问题3.1 会话状态(Session …...
【【深入浅出TinyRisc-v】】
深入浅出TinyRisc-v 本代码参考于 https://gitee.com/liangkangnan/tinyriscv 自己理解之后又重新写了一遍 tinyriscv.v // 涓嬮潰鏄鏁翠釜top妯″潡鐨勪功鍐? module tinyriscv(input clk ,input rst_n …...

常见的限流算法
常见的限流算法 限流的定义固定窗口算法滑动窗口算法漏桶算法(推荐)令牌桶算法(推荐)限流粒度本地限流(单机限流)分布式限流(多机限流)分布式限流的实现 限流的定义 限流,也称流量控制。是指系统…...
【Leetcode 每日一题】3159. 查询数组中元素的出现位置
问题背景 给你一个整数数组 n u m s nums nums,一个整数数组 q u e r i e s queries queries 和一个整数 x x x。 对于每个查询 q u e r i e s [ i ] queries[i] queries[i],你需要找到 n u m s nums nums 中第 q u e r i e s [ i ] queries[i] q…...

xadmin后台首页增加一个导入数据按钮
xadmin后台首页增加一个导入数据按钮 效果 流程 1、在添加小组件中添加一个html页面 2、写入html代码 3、在urls.py添加导入数据路由 4、在views.py中添加响应函数html代码 <!DOCTYPE html> <html lang...
行为树详解(5)——事件驱动
【分析】 如果行为树的节点很多,那么会存在要经过很多节点才会走到动作节点的情况。显然,性能上不如状态机。 每帧都需要重新遍历一系列节点才会走到动作节点,而实际上很多条件节点在数帧内不会有变化,这是造成性能问题的重要原…...

3.若依前端项目拉取、部署、访问
因为默认RuoYi-Vue是使用的Vue2,所以需要另外去下载vue3来部署。 拉取代码 git clone https://gitee.com/ys-gitee/RuoYi-Vue3.git 安装node才能执行npm相关的命令 执行命令npm install 如果npm install比较慢的话,需要添加上国内镜像 npm install --registrhttp…...
Debian操作系统相对于Ubuntu有什么优势吗?
更高的稳定性:Debian 以其出色的稳定性闻名,得益于严格的软件包测试和发布流程。其稳定版经过长时间测试与验证,确保了系统的高度稳定,更适合对稳定性要求极高的长期运行服务器环境。而 Ubuntu 虽有稳定版本,但更新周期…...

【漏洞复现】CVE-2015-3337 Arbitrary File Reading
漏洞信息 NVD - CVE-2015-3337 Directory traversal vulnerability in Elasticsearch before 1.4.5 and 1.5.x before 1.5.2, when a site plugin is enabled, allows remote attackers to read arbitrary files via unspecified vectors. 在安装了具有“site”功能的插件以…...

win10、win11-鼠标右键还原、暂停更新
系统优化 win 10jihuo win 11jihuo鼠标右键还原暂停更新 update 2024.12.28win 10 jihuo winx,打开powershell管理员,输入以下命令,选择1并等待 irm https://get.activated.win | iex参考:https://www.bilibili.com/video/BV1TN411M72J/?sp…...
FFmpeg来从HTTP拉取流并实时推流到RTMP服务器
当使用FFmpeg来从HTTP拉取流并实时推流到RTMP服务器时,你可以使用以下命令: ffmpeg -i http://输入流地址 -c:v copy -c:a copy -f flv rtmp://RTMP服务器地址/应用名称/流名称 这是一个基本的命令示例,其中: - -i http://输入流地…...

Quo Vadis, Anomaly Detection? LLMs and VLMs in the Spotlight 论文阅读
文章信息: 原文链接:https://arxiv.org/abs/2412.18298 Abstract 视频异常检测(VAD)通过整合大语言模型(LLMs)和视觉语言模型(VLMs)取得了显著进展,解决了动态开放世界…...
Rust : tokio中select!
关于tokio的select宏,有不少的用途。包括超时和竞态选择等。 关于select宏需要关注,相关的异步条件,会同时执行,只是当有一个最早完成时,会执行“抛弃”和“对应”策略。 说明:对本文以下素材的来源表示感…...

【hackmyvm】hacked靶机wp
tags: HMVrootkitDiamorphine Type: wp 1. 基本信息^toc 文章目录 1. 基本信息^toc2. 信息收集2.1. 端口扫描2.2. 目录扫描2.3. 获取参数 3. 提权 靶机链接 https://hackmyvm.eu/machines/machine.php?vmHacked 作者 sml 难度 ⭐️⭐️⭐️⭐️️ 2. 信息收集 2.1. 端口扫描…...

MaixBit k210学习记录
开发背景:Window系统主机,在主机上安装了虚拟机(VirtualBoxUbuntu23.04) 目标实现:在虚拟机(Ubuntu)中,实现对Maix bit(k210)开发板的开发 虚拟机的安装参考…...

Wordperss漏洞 DeDeCMS漏洞
Wordperss漏洞 环境搭建 #执⾏命令 cd /vulhub/wordpress/pwnscriptum docker-compose up -d #靶场地址 http://8.155.7.173:8080/wp-admin/ 注册账号 登录 漏洞一:后台修改模板拿WebShell 步骤一:思路是修改其WP的模板写入⼀句话木马后门并访问其文件…...

如何构建有效的AI Agents:从复杂到简约——深度解读Claude实践总结《Building effective agents》(上)
在人工智能技术日新月异的今天,大语言模型(LLM)已经成为技术创新的热点。 然而,在追逐技术前沿的热潮中,我们是否忽视了工程设计的本质? 作为全球人工智能领域的领军企业之一,Anthropic以其在AI安全和伦理方面的深入…...
git status 耗时
某个git库每次status一下就是半小时起步,gc后还是没有效果,后来排查记录发现某笔记录提交几百G的冗余文件,虽然revert了,但是还是存在库中,遂如下清理: # 查找大文件 git verify-pack -v .git/objects/pac…...

【鱼皮-用户中心】笔记
任务:完整了解做项目的思路,接触一些企业及的开发技术 title 企业做项目流程需求分析技术选型 计划一一、前端初始化1. **下载node.js**2. **安装yarn**3. **初始化 Ant Design Pro 脚⼿架(关于更多可进入官网了解)**4. **开启Umi…...

uniapp中view标签使用范围
不止用于微信小程序。兼容型号,是uniapp内置组件之一,在uniapp中进行了跨平台适配。支持所有uniapp的平台。如微信小程序、h5、app、支付宝小程序...

【深度学习】15. Segment Anything Model (SAM) :基于提示的分割新时代
Segment Anything Model (SAM) :基于提示的分割新时代 基本介绍 The first foundation model for promptable segmentation. Segment Anything Model(简称 SAM)是 Meta AI 于 2023 年提出的一种通用型图像分割基础模型。与以往分割模型不同&…...
【PmHub面试篇】Gateway全局过滤器统计接口调用耗时面试要点解析
你好,欢迎来到本次关于Gateway全局过滤器统计接口调用耗时的面试系列分享。在这篇文章中,我们将深入探讨这一技术领域的相关面试题预测。若想对相关内容有更透彻的理解,强烈推荐参考之前发布的博文:【PmHub后端篇】PmHub Gateway全…...

16-前端Web实战(Tlias案例-部门管理)
在前面的课程中,我们学习了Vue工程化的基础内容、TS、ElementPlus,那接下来呢,我们要通过一个案例,加强大家对于Vue项目的理解,并掌握Vue项目的开发。 这个案例呢,就是我们之前所做的Tlias智能学习辅助系统…...

NLP学习路线图(十九):GloVe
自然语言处理(NLP)的核心挑战在于让机器理解人类语言的丰富含义。词向量(Word Embeddings)技术通过将词语映射到高维实数空间,将离散的符号转化为连续的向量,为NLP任务奠定了坚实基础。在众多词向量模型中&…...

星动纪元的机器人大模型 VPP,泛化能力效果如何?与 VLA 技术的区别是什么?
点击上方关注 “终端研发部” 设为“星标”,和你一起掌握更多数据库知识 VPP 利用了大量互联网视频数据进行训练,直接学习人类动作,减轻了对于高质量机器人真机数据的依赖,且可在不同人形机器人本体之间自如切换,这有望…...

工厂方法模式深度解析:从原理到应用实战
作者简介 我是摘星,一名全栈开发者,专注 Java后端开发、AI工程化 与 云计算架构 领域,擅长Python技术栈。热衷于探索前沿技术,包括大模型应用、云原生解决方案及自动化工具开发。日常深耕技术实践,乐于分享实战经验与…...
云原生周刊:探索 Gateway API v1.3.0
开源项目推荐 WatchAlert WatchAlert 是一个轻量级、云原生的多数据源监控告警引擎,支持 AI 驱动的智能告警分析,旨在帮助升级您的监控系统架构。该项目基于 Go 和 React 开发,提供了现代化的前后端架构。后端使用 Go 语言,结合…...
Linux运维笔记:服务器感染 netools 病毒案例
文章目录 背景排查过程1. 发现异常2. 检测隐藏进程3. 尝试终止进程4. 深入分析进程 处理步骤1. 禁用 Cron 任务2. 删除恶意文件3. 终止恶意进程4. 重启系统 注意事项总结 提示:本文记录了一起 Linux 服务器感染恶意软件(疑似挖矿病毒)的排查与…...