Unity里面两种单例模式的实现

using System;

public class Singleton<T> where T : class, new()
{
	private static T m_instance;

	public static T instance
	{
		get
		{
			if (Singleton<T>.m_instance == null)
			{
				Singleton<T>.CreateInstance();
			}
			return Singleton<T>.m_instance;
		}
	}

	protected Singleton()
	{
	}

	public static void CreateInstance()
	{
		if (Singleton<T>.m_instance == null)
		{
			Singleton<T>.m_instance = Activator.CreateInstance<T>();
			(Singleton<T>.m_instance as Singleton<T>).Init();
		}
	}

	public static void DestroyInstance()
	{
		if (Singleton<T>.m_instance != null)
		{
			(Singleton<T>.m_instance as Singleton<T>).UnInit();
			Singleton<T>.m_instance = (T)((object)null);
		}
	}

	public static T GetInstance()
	{
		if (Singleton<T>.m_instance == null)
		{
			Singleton<T>.CreateInstance();
		}
		return Singleton<T>.m_instance;
	}

	public static bool HasInstance()
	{
		return Singleton<T>.m_instance != null;
	}

	public virtual void Init()
	{
	}

	public virtual void UnInit()
	{
	}
}

  

using UnityEngine;

public class MonoSingleton<T> : MonoBehaviour where T : MonoBehaviour
{
    private static bool applicationIsQuitting = false;
    private static T _instance;
    private static object _lock = new object();

    public static T Instance
    {
        get
        {
            if (applicationIsQuitting)
            {
                Debug.LogWarning("[Singleton] Instance " + typeof(T) +
                    " already destroyed on application quit." +
                    "Won‘t create again - returning null.");
                return null;
            }
            lock (_lock)
            {
                if (_instance == null)
                {
                    _instance = (T)FindObjectOfType(typeof(T));
                    if (_instance == null)
                    {
                        GameObject singleton = new GameObject();
                        _instance = singleton.AddComponent<T>();
                        singleton.name = "(singleton) " + typeof(T).ToString();
                        DontDestroyOnLoad(singleton);
                        Debug.Log("[Singleton] An instance of " + typeof(T) +
                            " is needed in the scene, so ‘" + singleton +
                            "‘ was created with DontDestroyOnLoad.");
                    }
                    else
                    {
                        Debug.Log("[Singleton] Using instance already created: " +
                            _instance.gameObject.name);
                    }
                }
                return _instance;
            }
        }
    }

    ///////////////////////////////////////////

    private void Awake()
    {
        Init();
    }

    private void Update()
    {
        Tick();
    }
    private void OnDestroy()
    {
        applicationIsQuitting = true;
        UnInit();
    }

    ///////////////////////////////////////////

    protected virtual void Init()
    {

    }

    protected virtual void UnInit()
    {

    }

    protected virtual void Tick()
    {

    }

}

  

时间: 2024-10-25 18:09:21

Unity里面两种单例模式的实现的相关文章

iOS开发笔记-两种单例模式的写法

iOS开发笔记-两种单例模式的写法 单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h" static ServiceManager *defaultManager; @implementation ServiceManager +(ServiceManager *)defaultManager{ if(!defaultManager) defaultManager=[[self allocWith

7、java实现的两种单例模式

/* 两种单例模式的演示 */ //饿汉式 class Signal { private Signal(){} private Signal s = new Signal(); public static Signal getInstance() { return s; } } //懒汉式 class Signal { private Signal(){} private Signal s = null; public static Signal getInstance() { if(s ==

两种单例模式的写法

iOS的单例模式有两种官方写法,如下: (1)不使用GCD #import "ServiceManager.h" static ServiceManager *defaultManager; @implementation ServiceManager +(ServiceManager *)defaultManager{ if(!defaultManager) defaultManager=[[self allocWithZone:NULL] init]; return default

java两种单例模式

第一种 1 package com.atguigu.javase; 2 import java.io.IOException; 3 4 /** 5 * @author _aL0n4k 6 * @version 1.0 7 * @time 2015年9月2日 下午6:12:52 8 */ 9 public class Singleton_HungerMode { //单例模式 - 饥饿式 10 private Singleton_HungerMode() {} //把构造器设置为private,这

java基础——java内存,两种单例模式

/* * java运行内存: * 堆(heap):存储的全是对象,每个对象都包含一个与之对应的class信息 * 只有一个heap,被所有线程共享,heap中不存放基本数据类型和对象引用,只放对象本身 * 栈:每个线程都有属于自己的栈(用户态栈),栈中保存基本数据类型的对象和自定义对象的引用,这个引用指向了堆区的实例 * 方法区(静态区):被所有线程共享,包含所有的class和static变量 * 包含整个程序中永远唯一的元素,即class,static变量 * * * 如何确定一个属性,方法要

Unity 2D两种常用判断点击的方法

1.Raycast法 原理相同于3D中得Raycast法,具体使用略有区别. 1 RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero); 2 3 if(hit.collider != null) 5 { 7 Debug.Log ("Target Position: " + hit.collider.gameObject.transfo

java:常用的两种设计模式(单例模式和工厂模式)

一.单例模式:即一个类由始至终只有一个实例.有两种实现方式(1)定义一个类,它的构造方法是私有的,有一个私有的静态的该类的变量在初始化的时候就实例化,通过一个公有的静态的方法获取该对象.Java代码 1. //单例模式的第一种形式    2. public class Singleton01 {    3.    4.     // 私有的静态属性    5.     private static Singleton01 instance = new Singleton01();    6.  

两种项目中可用的单例模式

一个正常的饿汉单例模式 //CEO,饿汉单例模式 public class CEO extends Staff{ private static final CEO mCeo = new CEO(); //构造函数私有 private CEO(){ } //公有的静态函数,对外暴露获取单例对象的接口 public static CEO getCeo(){ return mCeo; } @Override public void work(){ //管理VP } } 这种最简单的单例模式存在资源消耗

设计模式----单例模式的两种创建方法

一.实现单例模式的需要的条件: 1,有私有的构造器; 2,一个静态方法; 3,一个静态变量. 二.实现单例模式的两种方法: 第一种:急切实例化 package singleton; /** * 急切实例化 * @author lenovo * */ public class Singleton2 { private static Singleton2 uniqueInstance = new Singleton2(); private Singleton2(){ } public static