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

设计模式 --- 原型模式

原型模式是创建型模式的一种,是在一个原型的基础上,建立一致的复制对象的方式。这个原型通常是我们在应用程序生命周期中需要创建多次的一个典型对象。为了避免初始化新对象潜在的性能开销,我们可以使用原型模式来建立一个非常类似于复印机的系统。通过实现原型模式,我们将能够即时复制典型对象,同时将对我们应用程序的整体性能的影响降到最低。
​​在游戏开发中,原型模式尤其适合需要动态、高效生成可变对象的场景​​,配合Unity的预制体系统能大幅提升开发效率。

优点:

1.减少初始化开销:从理论上讲,复制一个已经存在于内存中的对象比初始化一个新的对象要快。
2.实例在内存中的可复用性:在原型对象从一种状态转移到另一种状态时,可以复制其排列组合。
3.一致性:让对象复制自己具有结构上的好处;它更安全,并为复制过程提供了一个标准接口。

缺点: 

1.维护引用:如果总是在复制对象之前销毁原型对象,那么我们将最终使使用该模式的任何好处化为乌有。
2.不支持的循环引用:在某些情况下,对象具有不支持克隆的内部结构。在这些情况下,在实现原型模式的系统中可能难以使用对象。

说明例子:

1.UML类图:

2.实现:

1.实现ICopyable的接口:

public interface ICopyable
{
    ICopyable Copy();
}

2.实现Enemy类:

public class Enemy : MonoBehaviour, ICopyable
{
    public ICopyable Copy()
    {
        return Instantiate(this);
    }
}

3.实现EnemySpawner类:

public class EnemySpawner
{
    public ICopyable mCopy;

    public Enemy SpawnEnemy(Enemy prototype)
    {
        mCopy = prototype.Copy();
        return (Enemy)mCopy;
    }
}

4.实现具体的Enemy类,SoliderA,SoliderB

public class SoliderA : Enemy
{
    public void Awake()
    {
        Debug.Log("创建了A");
    }
}

public class SoliderB : Enemy
{
    public void Awake()
    {
        Debug.Log("创建了B");
    }
}

5.测试:

public class PrototypePattern : MonoBehaviour
{
    public SoliderA soliderAPrototype;
    public SoliderB soliderBPrototype;

    private EnemySpawner mEnemySpawner;

    void Start()
    {
        mEnemySpawner = new EnemySpawner();
        mEnemySpawner.SpawnEnemy(soliderAPrototype);
        mEnemySpawner.SpawnEnemy(soliderBPrototype);
    }
}

游戏中的使用场景:

1.敌人/NPC生成
2.武器/道具系统
3.技能特效复用
4.关卡元素动态生成
5.玩家角色生成
6.AI行为树配置

参考书籍以及相关链接:

《Hands-On Game Development Patterns with Unity 2019》

原型模式 - 维基百科,自由的百科全书 (wikipedia.org)

Prototype Design Pattern (C#) (youtube.com)

hw_dungeonwaterfall1c_h_en_120 (youtube.com)

相关文章:

  • 跨省发布抖音作品,IP属地会随之变化吗?
  • C++day9
  • 电阻的额定功率与额定电压详解
  • 【什么是动态链接?这里的动态是什么意思?链接了什么?】
  • 【人工智能】如何通过精准提示工程实现完美的珠宝首饰展示
  • 企业使用Excel开展数据分析限制和建议完整版
  • 基于大模型的非阵发性室性心动过速风险预测与诊疗方案研究报告
  • Android中Jetpack设计理念、核心组件 和 实际价值
  • PGA 简介
  • 单元测试原则之——不要过度模拟
  • 刮板机断链保护装置的运行机制
  • JavaScript高阶函数的定义
  • VFlash 工具使用教程
  • 基于视觉语言模型的机器人实时探索系统!ClipRover:移动机器人零样本视觉语言探索和目标发现
  • Spring入门概念 以及入门案例
  • 使用 Mapped Pinned Memory 优化 YOLOv10 TensorRT 推理速度:Zero-Copy 技术实战
  • 大学论文书写规范与格式说明
  • CJ92930在消费类领域的运用
  • Java服务端开发基石:深入理解Spring IoC与依赖注入 (DI)
  • 替换jeecg图标
  • 服装网站建设可行性分析/虎扑体育网体育
  • 餐饮加盟培训网站建设/十种营销方式
  • 北京网站快速排名优化/交换友情链接推广法
  • 做网站超速云/真正免费的网站建站平
  • 东莞清溪镇做网站公司/百度竞价培训
  • 招商加盟网站系统/南宁seo内部优化