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

熟悉各类游戏设计模式的用途与限制,如 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提高对象复用性,减少创建和销毁的性能开销。提高性能,减少内存分配频率。池大小管理需要优化,不适合生命周期复杂的对象。

通过掌握这些设计模式,可以更高效地开发和维护游戏项目,满足不同的需求场景,同时为后期的扩展和优化打下良好的基础。

http://www.lryc.cn/news/511546.html

相关文章:

  • 【RabbitMQ高级篇】消息可靠性问题(1)
  • ASP.NET |日常开发中常见问题归纳讲解
  • 【【深入浅出TinyRisc-v】】
  • 常见的限流算法
  • 【Leetcode 每日一题】3159. 查询数组中元素的出现位置
  • xadmin后台首页增加一个导入数据按钮
  • 行为树详解(5)——事件驱动
  • 3.若依前端项目拉取、部署、访问
  • Debian操作系统相对于Ubuntu有什么优势吗?
  • 【漏洞复现】CVE-2015-3337 Arbitrary File Reading
  • win10、win11-鼠标右键还原、暂停更新
  • FFmpeg来从HTTP拉取流并实时推流到RTMP服务器
  • Quo Vadis, Anomaly Detection? LLMs and VLMs in the Spotlight 论文阅读
  • Rust : tokio中select!
  • 【hackmyvm】hacked靶机wp
  • MaixBit k210学习记录
  • Wordperss漏洞 DeDeCMS漏洞
  • 如何构建有效的AI Agents:从复杂到简约——深度解读Claude实践总结《Building effective agents》(上)
  • git status 耗时
  • C++进阶重点知识(一)|智能指针|右值|lambda|STL|正则表达式
  • OSCP打靶大冒险之Solidstate:多端口获取信息,shell逃逸,计划任务提权
  • 八股(One Day one)
  • 如何快速又安全的实现端口转发【Windows MAC linux通用】
  • LongLLMLingua: 长上下文场景的智能提示压缩框架
  • Django serializers:把ValidationError处理的更优雅
  • CASA(Carnegie-Ames-Stanford Approach) 模型原理及实践技术
  • 【HarmonyOS之旅】ArkTS语法(一)
  • 【畅购电商】项目总结
  • python|利用ffmpeg按顺序合并指定目录内的ts文件
  • IP属地和所在地不一致什么意思?怎么换成另外一个地方的