设计模式 --- 原型模式

news2025/4/15 12:33:20

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

总结:​​

原型模式的核心价值​​在于通过​​克隆已有对象​​快速生成新实例,特别适用于以下场景:
1.对象初始化成本高(如需要加载资源)。
2.需要动态调整对象属性并批量生成。
3.避免工厂类或继承带来的代码冗余。

参考书籍以及相关链接:

《Hands-On Game Development Patterns with Unity 2019》

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

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

hw_dungeonwaterfall1c_h_en_120 (youtube.com)

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

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

相关文章

汽车软件开发常用的建模工具汇总

目录 往期推荐 1.Enterprise Architect(EA) 2.MATLAB/Simulink 3.TargetLink 4.Rational Rhapsody 5.AUTOSAR Builder 6.PREEvision 总结 往期推荐 2025汽车行业新宠:欧企都在用的工具软件ETAS工具链自动化实战指南<一&am…

SSM废品买卖回收管理系统的设计与实现

🍅点赞收藏关注 → 添加文档最下方联系方式咨询本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅 项目视频 07…

@SchedulerLock 防止分布式环境下定时任务并发执行

背景 在一个有多个服务实例的分布式系统中,如果你用 Scheduled 来定义定时任务,所有实例都会执行这个任务。ShedLock 的目标是只让一个实例在某一时刻执行这个定时任务。 使用步骤 引入依赖 当前以redisTemplate为例子,MongoDB、Zookeeper…

实信号的傅里叶变换为何属于埃尔米特函数?从数学原理到 MATLAB 动态演示

引言 在信号处理领域,傅里叶变换是分析信号在频域表现的重要工具。特别是对于实信号,实信号是指在时间或空间域内取值为实数的信号,例如音频信号、温度变化等,它的傅里叶变换展现了一个非常特殊的数学性质——共轭对称性&#xf…

【VitePress】新增md文件后自动更新侧边栏导航

目录 说在前面先看效果代码结构详细说明侧边栏格式utils监听文件变化使用pm2管理监听进程 说在前面 操作系统:windows11node版本:v18.19.0npm版本:10.2.3vitepress版本:1.6.3完整代码:github 先看效果 模板用的就是官…

docker部署scylladb

创建存储数据的目录和配置目录 mkdir -p /root/docker/scylla/data/data /root/docker/scylla/data/commitlog /root/docker/scylla/data/hints /root/docker/scylla/data/view_hints /root/docker/scylla/conf快速启动拷贝配置文件 docker run -d \--name scylla \scylladb/…

Android 16应用适配指南

Android 16版本特性介绍 https://developer.android.com/about/versions/16?hlzh-cn Android 16 所有功能和 API 概览 https://developer.android.com/about/versions/16/features?hlzh-cn#language-switching Android 16 发布时间 Android 16 适配指南 Google开发平台&…

2.2goweb解析http请求信息

Go语言的net/http包提供了一些列用于表示HTTP报文的解构。我们可以使用它处理请求和发送响应。其中request结构体代表了客户端发生的请求报文。 核心字段获取方法 1. 请求行信息 通过 http.Request 结构体获取: func handler(w http.ResponseWriter, r *http.Req…

本地部署大模型(ollama模式)

分享记录一下本地部署大模型步骤。 大模型应用部署可以选择 ollama 或者 LM Studio。本文介绍ollama本地部署 ollama官网为:https://ollama.com/ 进入官网,下载ollama。 ollama是一个模型管理工具和平台,它提供了很多国内外常见的模型&…

redis之缓存击穿

一、前言 本期我们聊一下缓存击穿,其实缓存击穿和缓存穿透很相似,区别就是,缓存穿透是一些黑客故意请求压根不存在的数据从而达到拖垮系统的目的,是恶意的,有针对性的。缓存击穿的情况是,数据确实存在&…

txt、Csv、Excel、JSON、SQL文件读取(Python)

txt、Csv、Excel、JSON、SQL文件读取(Python) txt文件读写 创建一个txt文件 fopen(rtext.txt,r,encodingutf-8) sf.read() f.close() print(s)open( )是打开文件的方法 text.txt’文件名 在同一个文件夹下所以可以省略路径 如果不在同一个文件夹下 ‘…

【NLP解析】多头注意力+掩码机制+位置编码:Transformer三大核心技术详解

目录 多头注意力:让模型化身“多面手” 技术细节:多头注意力如何计算? 实际应用:多头注意力在Transformer中的威力 为什么说多头是“非线性组合”? 实验对比:多头 vs 单头 进阶思考:如何设计更高…

Downlink Sensing in 5G-Advanced and 6G: SIB1-assisted SSB Approach

摘要——本文研究了利用现有5G NR信号进行网络侧集成感知与通信(ISAC)的潜力。通常,由于其频繁的周期性可用性和波束扫描特性,同步信号块(SSB)是适合用于下行感知的候选信号。然而,正如本文所示…

设计模式 Day 8:策略模式(Strategy Pattern)完整讲解与实战应用

🔄 前情回顾:Day 7 重点回顾 在 Day 7 中,我们彻底讲透了观察者模式: 它是典型的行为型模式,核心理念是“一变多知”,当一个对象状态变化时,自动通知所有订阅者。 我们通过 RxCpp 实现了工业…

ONVIF/RTSP/RTMP协议EasyCVR视频汇聚平台RTMP协议配置全攻略 | 直播推流实战教程

在现代化的视频管理和应急指挥系统中,RTMP协议作为一种高效的视频流传输方式,正变得越来越重要。无论是安防监控、应急指挥,还是物联网视频融合,掌握RTMP协议的接入和配置方法,都是提升系统性能和效率的关键一步。 今天…

《微服务与事件驱动架构》读书分享

《微服务与事件驱动架构》读书分享 Building Event-Driver Microservices 英文原版由 OReilly Media, Inc. 出版,2020 作者:[加] 亚当 • 贝勒马尔 译者:温正东 作者简介: 这本书由亚当贝勒马尔(Adam Bellemare…

每日一题(小白)暴力娱乐篇26

我们先直接尝试暴力循环四轮看能不能得到答案,条件:四个数的平方相加等于这个数 ①接收答案result ②循环四轮i,j,k,l ③如果i*ij*jk*kl*lresult ④按照要求的格式输出这四个数字 代码如下👇 public s…

如何使用AI辅助开发R语言

R语言是一种用于统计计算和图形生成的编程语言和软件环境,很多学术研究和数据分析的科学家和统计学家更青睐于它。但对与没有编程基础的初学者而言,R语言也是有一定使用难度的。不过现在有了通义灵码辅助编写R语言代码,我们完全可以用自然语言…

Git版本管理系列:(三)远程仓库

目录 与远程仓库平台(github\gitee等)建立连接本地仓库关联远程仓库本地仓库内容推送远程仓库:PUSH将远程仓库的更新拉取到本地:PULL语法总结 与远程仓库平台(github\gitee等)建立连接 远程仓库平台相当于一个网盘,我们可以把自己的代码上传上去。就像网…

React Hooks: useRef,useCallback,useMemo用法详解

1. useRef(保存引用值) useRef 通常用于保存“不会参与 UI 渲染,但生命周期要长”的对象引用,比如获取 DOM、保存定时器 ID、WebSocket等。 新建useRef.js组件,写入代码: import React, { useRef, useSt…