Unity设计模式之单例模式

定义

单例模式(Singleton)是设计模式中很常见的一种设计模式,目的是为了让一个类在程序运行期间有且仅有一个实例,且方便全局访问。

实现

1、私有的构造函数。

2、含有一个该类的静态私有对象。

3、静态的公有函数或属性,方便用户创建或者获取它本身的静态私有对象。

适用场景

当项目中的某一个对象,在程序运行的过程中,只有一个对象,可以使用单例模式。

例如:资源管理类,日志管理类等,受项目影响比较小,可以多个项目共同使用。

优缺点

优点

1、单例模式只生成一个实例,限制对象数量,减少内存开支和系统性能消耗。

2、使用方便,提供全局访问的函数或属性。

缺点

1、容易为了使用方便造成过度使用的问题,但并不是要求设计者不使用这个模式,而是在仔细设计和特定的前提下,适当使用。

举例

C# 单例


/// <summary>
/// 一个简单的单例
/// </summary>
public class Test
{#region Instanceprivate static Test _Instance;public static Test Instance{get{if (_Instance == null){_Instance = new Test();}return _Instance;}}private Test() { }#endregion
}

Unity mono单例

相比于C#单例,mono单例需要注意的是

1、创建对象的时候,需要创建一个相应的对象,然后将脚本添加。

2、对象Awake的时候,需要判断是否已经创建了对象,如果创建了,需要销毁当前对象。

3、我这里在OnDestroy的时候,把静态变量销毁了,是因为有些逻辑里面可能需要销毁这个对象,重新创建。

using UnityEngine;/// <summary>
/// 一个简单的mono单例
/// </summary>
public class Test : MonoBehaviour
{#region Instanceprivate static Test _Instance;public static Test Instance{get{if (!_Instance){_Instance = GameObject.FindObjectOfType<Test>();if (!_Instance){GameObject obj = new GameObject();_Instance = obj.AddComponent<Test>();}}return _Instance;}}private void Awake(){if (_Instance){Destroy(gameObject);}}private void OnDestroy(){_Instance = null;}#endregion
}

通用mono单例

要做一个通用的mono单例,这里我们需要使用泛型来实现一个基类。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;/// <summary>
/// mono单例
/// </summary>
/// <typeparam name="T"></typeparam>
public abstract class MonoSingleton<T> : MonoBehaviour where T : MonoSingleton<T>
{protected static T _instance;/// <summary>/// 是否实例化/// </summary>public static bool initialized;public static T Instance{get{if (_instance == null){_instance = FindObjectOfType<T>();if (FindObjectsOfType<T>().Length > 1){return _instance;}if (_instance == null){string name = typeof(T).Name;GameObject obj = GameObject.Find(name);if (obj == null){obj = new GameObject(name);}_instance = obj.AddComponent<T>();DontDestroyOnLoad(obj);}}initialized = true;return _instance;}}protected virtual void Awake(){if (initialized){Destroy(gameObject);}}protected virtual void OnDestroy(){_instance = null;initialized = false;}
}

实现类

using UnityEngine;/// <summary>
/// 一个简单的mono单例
/// </summary>
public class Test : MonoSingleton<Test>
{public void MonoTest() {Debug.Log("test");}
}

尾语

如果有说的不好的地方,欢迎各位大佬批评指正。

Unity设计模式之单例模式相关推荐

  1. socket可以写成单例嘛_精读《设计模式 - Singleton 单例模式》

    Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...

  2. C#设计模式(1)——单例模式

    原文地址:http://www.cnblogs.com/zhili/p/SingletonPatterm.html 一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设 ...

  3. java设计模式之单例模式(七种方法)

    单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...

  4. java单例模式的七种写法_Java设计模式之单例模式的七种写法

    什么是单例模式? 单例模式是一种常见的设计模式,单例模式的写法有很多种,这里主要介绍三种: 懒汉式单例模式.饿汉式单例模式.登记式单例 . 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类 ...

  5. go设计模式之单例模式

    在这里插入图片描述# go设计模式之单例模式 在软件开发时,经常会遇到有些对象需要保证只有一个实例的,那么这种设计模式就应用而生. 定义 单例模式,也叫单子模式,是一种常用的软件设计模式,属于创建型模 ...

  6. 一篇博客读懂设计模式之---单例模式

    一篇博客读懂设计模式之---单例模式 一.  单例模式 单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处 ...

  7. Java 设计模式(3)单例模式

    前言 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自 ...

  8. socket可以写成单例嘛_精读设计模式 Singleton 单例模式

    Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...

  9. 设计模式之单例模式——Singleton

                        设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...

最新文章

  1. CV06-Xception笔记
  2. 带实证明,imshow是能显示数据归一化到0到1的图像的!
  3. 中国半导体硅片行业未来发展趋势与销售规模预测报告2022版
  4. 变压器符号_3D动画解析油浸式和干式变压器,看完让你秒懂
  5. neo4j java label_Neo4j:在具有相同Label的两个或多个节点之间创建关系
  6. lds天线技术流程图_音箱耳机入门,蓝牙真无线耳机中的LDS天线 「Soomal」
  7. 工作278:控制数据从字典表获取
  8. python的特性注定了代码无法保密_python 基础
  9. 如何利用FL Studio进行听湿录干的声音录制
  10. 如何将多张二维码合成一个新的动态二维码进行随机扫码
  11. php极光短信接口接入
  12. 新印的钞票如何流入市场?
  13. python 入门总结(一)
  14. 【随笔】7月休假:粤港澳大湾区旅程记录
  15. 虚拟空间考古?其实它早在一千年前就存在了 | 浅空间专栏
  16. 基于深度学习和3D图像处理的精密加工件外观缺陷检测系统
  17. arduino的C语言基础
  18. 华为畅享20plus支持鸿蒙系统吗,华为畅享20 plus有nfc吗?畅享20 plus支持红外功能吗?...
  19. 56岁潘石屹生日当天宣布要学编程语言Python,网友:地产商来抢码农饭碗了!...
  20. 企业微信管理员账号查看员工客户

热门文章

  1. Windbg 保存字体设置
  2. Python 高级编程
  3. 物联网开发框架Niagara - Part1概述
  4. js字体溢出字体变小_如何在网络上使用可变字体
  5. SpringBooot MD5加盐加密
  6. 程序员大本营GitHub遭黑客劫持,是时候认真聊聊开源代码安全了
  7. 分治算法——分金块、求残缺棋盘问题
  8. 如何查自己电脑的ip地址
  9. a记录 mysql_域名的A记录、mx记录、ns记录等怎么查看
  10. Vue基础教程视频: