DesignMode__unity__抽象工厂模式在unity中的应用、用单例模式进行资源加载

news2024/11/16 13:32:22

目录

抽象工厂模式

思维导图

接口(抽象类)

工厂接口

抽象产品类

抽象武器接口

抽象人物接口

具体工厂和具体产品

具体工厂

(1)产品接口,生成具体人物

(2)武器接口,生成具体武器

具体产品的实现

Soldier类型

ShotGunA 类型

单例模式资源加载

测试

GameController

PerformanceTest


抽象工厂模式

思维导图

一个工厂里面可以生产多个产品

一个工厂可以生产一系列产品(一族产品),极大减少了工厂类的数量

接口(抽象类)

工厂接口

在工厂里声明创造的武器和产品

武器:创造武器方法创造具体的武器

人物:创造产品方法创造具体的人物

public interface IGameFactory
{
    IWeapon GreateWeapon();
    ICharacter CreateCharacter();
}

抽象产品类

抽象武器接口

用来生产不同的武器,武器类型

/// <summary>
/// 抽象武器接口-抽象产品
/// </summary>
public interface IWeapon
{
    void Use();//使用武器
    void Display();//显示武器
}
抽象人物接口

用来生成不同的产品,人物类型

/// <summary>
/// 抽象产品
/// </summary>
public interface ICharacter
{
    void Display();//显示模型
}

具体工厂和具体产品

现代风格的具体工厂,返回具体的产品

具体工厂

(1)产品接口,生成具体人物

返回要生成的产品,Soldier类型

(2)武器接口,生成具体武器
public class ModernGameFactory : IGameFactory
{
    public ICharacter CreateCharacter()
    {
        return new Soldier();
    }

    public IWeapon GreateWeapon()
    {
        return new ShotGunA();
    }
}

具体产品的实现

Soldier类型

实现ICharacter接口,生产具体的人物

/// <summary>
/// 具体产品---士兵
/// </summary>
public class Soldier : ICharacter
{
    private GameObject _model;
    public Soldier()
    {
        _model = ResourceManager.Instance.GetResource("Bot/SoldierA");
    }
    public void Display()
    {
        if (_model != null)
        {
            GameObject.Instantiate(_model);
        }
        else
        {
            Debug.LogError("Soldier model not found");
        }
    }
}

ShotGunA 类型

ShotGunA产品的生产

实现IWeapon接口

public class ShotGunA : IWeapon
{
    private GameObject _model;
    public ShotGunA()
    {
         _model = ResourceManager.Instance.GetResource("Weapon/LaserGun_A");
    }
    public void Display()
    {
        if (_model != null)
        {
            GameObject.Instantiate(_model);
        }
        else
        {
            Debug.LogError("ShotGunA model not found");
        }
    }

    public void Use()
    {
        Debug.Log("使用武器");
    }
}

单例模式资源加载

单例模式(Singleton Pattern):是一种创建对象的设计模式,确保一个类只有一个实例,并提供全局访问点。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 单例模式
/// </summary>
public class ResourceManager
{
    //本类实例的引用
    private static ResourceManager _instance;
    //资源缓存器
    private Dictionary<string, GameObject> _resourceCache = new Dictionary<string, GameObject>();
    //为私有的字段准备的属性
    public static ResourceManager Instance
    {
        get
            //保证有且只有一个实例
        {
            if (_instance == null)
            {
                _instance = new ResourceManager();
            }
            return _instance;
        }
    }
    //获取资源的工作代码,从硬盘或者缓存中获取模型资源
    //传入路径path
    public GameObject GetResource(string path)
    {
        //询问资源存储器中是否包含当前路径(不需要重复加载)
        if (!_resourceCache.ContainsKey(path))
        {
            GameObject resource = Resources.Load<GameObject>(path);
            if (resource == null)
            {
                Debug.LogError($"Failed to load resource at path: {path}");
                return null;
            }
            _resourceCache[path] = resource;
        }
        return _resourceCache[path];
    }
}

测试

GameController

建个空物体挂上即可

功能:创建产品进行测试

public class GameController : MonoBehaviour
{
    private ICharacter _character;
    private IWeapon _weapon;
    public void StartGame(IGameFactory factory)
    {
        try
        {
            _character = factory.CreateCharacter();          
            _weapon = factory.GreateWeapon();
            _character.Display();
            _weapon.Use();
        }
        catch (System.Exception e)
        {
            Debug.LogError($"Error starting game: {e.Message}");
        }
    }
}

PerformanceTest

建个空物体挂上即可

功能:测试用抽象工厂模式创建物体和直接实例化物体的时间性能区别

(直接创建会快)

public class PerformanceTest : MonoBehaviour
{

    private void Start()
    {
        //TestDirectInstantiation(500);
        TestFactoryPattern(500);
    }
    //直接实例化
    void TestDirectInstantiation(int count)
    {
        Stopwatch stopwatch = new Stopwatch();
        stopwatch.Start();
        List<GameObject> objects = new List<GameObject>();
        GameObject prefab = Resources.Load<GameObject>("Bot/SoldierA");
        for (int i = 0; i < count; i++)
        {
            objects.Add(GameObject.Instantiate(prefab));
        }
        stopwatch.Stop();
        UnityEngine.Debug.Log($"Direct Instantiation ({count} objects): {stopwatch.ElapsedMilliseconds} ms");
        
        
        // Clean up
        foreach (var obj in objects)
        {
            GameObject.Destroy(obj);
        }
        objects.Clear();
        Resources.UnloadUnusedAssets();
    }




    //抽象工厂的实例化测试

    void TestFactoryPattern(int count)
    {
        Stopwatch stopwatch = new Stopwatch();
        stopwatch.Start();
        IGameFactory factory = new ModernGameFactory();
        List<ICharacter> characters = new List<ICharacter>();
        for (int i = 0; i < count; i++)
        {
            characters.Add(factory.CreateCharacter());
            characters[i].Display();
        }
        stopwatch.Stop();
        UnityEngine.Debug.Log($"Factory Pattern ({count} objects): {stopwatch.ElapsedMilliseconds} ms");

        //Clean up
        characters.Clear();
        Resources.UnloadUnusedAssets();
    }


}

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

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

相关文章

搜索引擎onesearch3实现解释和升级到Elasticsearch v8系列(五)-聚合

聚合 聚合基于Query结果的统计&#xff0c;执行过程是搜索的一部分&#xff0c;Onesearch支持0代码构建聚合&#xff0c;聚合目前完全在引擎层 0代码聚合 上图是聚合的配置&#xff0c;包括2个pdm文档聚合统计 termsOfExt term桶聚合&#xff0c;统计ext&#xff0c;如&…

JavaWeb——前端工程化(3/3):Vue项目开发流程(index.html、main.js和根组件之间的联系)

Vue项目开发流程 上篇我们介绍了工程化的 Vue 项目&#xff0c;将 Vue 项目启动起来并访问到了首页面。接下来&#xff0c;我们来分析如何访问到 Vue 项目的首页面&#xff0c;也就是 Vue 项目的开发流程。 现在访问的页面是 Vue 项目默认的首页 index.html&#xff0c;它是在…

Linux系统安装Julia语言并在VS Code中进行配置

Julia是一种专为科学计算而生的高级编程语言&#xff0c;具有开源、多平台、高性能的特点。Julia结合了动态语言的易用性与编译语言的速度&#xff0c;部分归功于其基于LLVM的JIT编译器&#xff0c;能够生成高效的本地代码。这使得Julia在许多情况下能够拥有与编译型语言&#…

56 mysql 用户权限相关的实现

前言 这里讨论 mysql 的权限相关处理 使用如下语句创建 tz_test 用户, 并赋予他 test_02 数据库的查询权限 create user tz_test% identified by tz_test; grant select on test_02.* to tz_test%; 查询目标数据表, 数据如下, tz_test_02 UPDATE command denied to user …

Centos 8安装VNC及多用户配置详细教程

Centos 8安装VNC及多用户配置详细教程 参考一、安装前准备二、安装三、创建新用户和设置VNC密码四、创建VNC系统服务文件五、多用户映射和配置VNC六、客户端用VNC Viewer登录 参考 1、参考1&#xff1a; VNC安装英文说明&#xff08;英文说明有误且仅适合单用户&#xff09;&a…

乌克兰因安全风险首次禁用Telegram

据BleepingComputer消息&#xff0c;乌克兰国家网络安全协调中心 &#xff08;NCCC&#xff09; 以国家安全为由&#xff0c;已下令限制在政府机构、军事单位和关键基础设施内使用 Telegram 消息应用程序。 这一消息通过NCCC的官方 Facebook 账号对外发布&#xff0c;在公告中乌…

java并发之并发理论

并发理论 Java 内存模型 Java 内存模型&#xff08;即 Java Memory Model&#xff0c;简称 JMM&#xff09;试图屏蔽各种硬件和操作系统的内存访问差异&#xff0c;以实现让 Java 程序在各种平台下都能达到一致的内存访问效果。 本身是一种抽象的概念&#xff0c;并不真实存在&…

【第十二章:Sentosa_DSML社区版-机器学习之回归】

目录 12.1 线性回归 12.2 决策树回归 12.3 梯度提升决策树回归 12.4 保序回归 12.5 XGBoost回归 12.6 随机森林回归 12.7 广义线性回归 12.8 LightGBM回归 12.9 因子分解机回归 12.10 AdaBoost回归 12.11 KNN回归 12.12 高斯过程回归 12.13 多层感知机回归 【第十…

vue Echart使用

一、在vue中使用Echarts 1.安装Echarts npm install echarts --save2.准备一个呈现图表的盒子 给盒子起名字是建议使用id选择器 这个盒子通常来说就是我们熟悉的 div &#xff0c;这个 div 决定了图表显示在哪里&#xff0c;盒子一定要指定宽和高 <div id"main&quo…

构建智能化直播美颜工具:视频美颜SDK的开发指南

本篇文章&#xff0c;笔者将为开发者提供一份详细的指南&#xff0c;帮助你从零开始构建智能化直播美颜工具&#xff0c;并了解视频美颜SDK的实现路径和优化策略。 一、视频美颜SDK的核心功能 视频美颜SDK主要功能是通过一系列图像处理算法&#xff0c;对主播的面部进行实时优…

安卓13删除下拉栏中的设置按钮 android13删除设置按钮

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 顶部导航栏下拉可以看到,底部这里有个设置按钮,点击可以进入设备的设置页面,这里我们将更改为删除,不同用户通过这个地方进入设置。也就是下面这个按钮。 2.问题分析…

[vulnhub] Hackademic.RTB1

第一次打靶机&#xff0c;思路看的红队笔记 https://www.vulnhub.com/entry/hackademic-rtb1,17/ 环境&#xff1a;kali Linux - 192.168.75.131&#xff0c;靶机 - 192.168.75.132 主机发现和端口扫描 扫描整个网络有哪台机子在线&#xff0c;不进行端口扫描 nmap -sP 192.16…

WordPress精选文章如何添加侧边栏和页面?

WordPress精选帖子是一项功能&#xff0c;可让用户在其网站主页或其他值得注意的部分突出显示特定帖子。这些精选帖子通常以视觉上独特的方式显示&#xff0c;例如以滑块、网格或轮播格式显示&#xff0c;以提高其可见性和对访问者的吸引力。 网站所有者可以手动选择他们想要推…

构建 Spring Data JPA 项目所需的依赖与配置

一、使用 Spring Boot Initializr 添加依赖的步骤&#xff08;IntelliJ IDEA 中的操作&#xff09; 打开 IntelliJ IDEA&#xff0c;选择 New Project > Spring Initializr。填写项目的 Group、Artifact、Project Metadata 等基础信息。选择 Maven Project&#xff0c;并选…

【第十六章:Sentosa_DSML社区版-机器学习之生存分析】

【第十六章&#xff1a;Sentosa_DSML社区版-机器学习之生存分析】 16.1 加速失效时间回归 1.算子介绍 加速失效时间回归模型Accelerated failure time (AFT)是一个监督型参数化的回归模型&#xff0c;它可以处理删失数据。它描述了一个生存时间的对数模型&#xff0c;所以它通…

【C语言从不挂科到高绩点】19-指针01【重点知识】

Hello!彦祖们,俺又回来了!!!,继续给大家分享 《C语言从不挂科到高绩点》课程!! 本节将为大家讲解C语言中非常重要的知识点-指针: 本套课程将会从0基础讲解C语言核心技术,适合人群: 大学中开设了C语言课程的同学想要专升本或者考研的同学想要考计算机等级证书的同学想…

论文阅读 | 一种基于潜在向量优化的可证明安全的图像隐写方法(TMM 2023)

TMM 2023 中国科学技术大学 针对现有的可证明安全的图像隐写不能抵抗有损图像操作&#xff0c;而现有的生成图像隐写不能证明安全问题&#xff0c;提出一种基于潜在向量优化的可证明安全的图像隐写方法&#xff08;名为PARIS&#xff09;&#xff0c;该方法受到逆采样器和噪声…

JAVA零基础入门——高级教程之集合框架

目录 1. 关于集合框架 1.1 集合接口 1.2 集合实现类 1.3 集合算法及迭代器和比较器的使用 2. 数据结构 2.1 ArrayList 2.2 LinkedList 2.3 HashMap 2.4 HashSet 3. 迭代器 1. 关于集合框架 集合框架是使用数据结构&#xff08;参见本文2. 数据结构&#xff09;来满…

【Qualcomm】高通SNPE框架的使用 | 原始模型转换为量化的DLC文件 | 在Android的CPU端运行模型

目录 ① 激活snpe环境 ② 设置环境变量 ③ 模型转换 ④ run on Android 首先&#xff0c;默认SNPE工具已经下载并且Setup相关工作均已完成。同时&#xff0c;拥有原始模型文件&#xff0c;本文使用的模型文件为SNPE 框架示例的inception_v3_2016_08_28_frozen.pb文件。imag…

如何只用 CSS 制作网格?

来源&#xff1a;how-to-make-a-grid-like-graph-paper-grid-with-just-css 在看 用于打印到纸张的 CSS 这篇文章时&#xff0c;对其中的网格比较好奇&#xff0c;作者提供了 stackoverflow 的链接&#xff0c;就看到了来源的这个问题和众多回复。本文从里面挑选了一些个人比较…