MonoBehaviour单例的另外一种省事的写法

 1 using UnityEngine;
 2 
 3 public class CommSystem: SingletonGeneric<CommSystem>
 4 {
 5     public static string version = "v1.0";
 6     private static CommSystemStub stub = (new GameObject("CommSystemStub")).AddComponent<CommSystemStub>();
 7 }
 8 
 9 public sealed class CommSystemStub : MonoBehaviour
10 {
11     private void Awake()
12     {
13         DontDestroyOnLoad(gameObject);
14     }
15 
16     private void Start()
17     {
18         
19     }
20 
21     private void Update()
22     {
23         
24     }
25 
26     private void OnDestroy()
27     {
28 
29     }
30 }
CommSystem是普通的Class
 1 public class SingletonGeneric<T> where T: class, new()
 2 {
 3     static private T _instance;
 4     static private readonly object th_safe = new object();
 5     static public T Instance
 6     {
 7         get
 8         {
 9             if (_instance == null)
10             {
11                 lock (th_safe)
12                 {
13                     if (_instance == null)
14                         _instance = new T();
15                 }
16             }
17             return _instance;
18         }
19     }
20 }

 下面的改写让泛型单例支持使用Private的构造函数,这样做更严谨:

 1 using System;
 2 
 3 public class SingletonGeneric<T> where T: class
 4 {
 5     static private T _instance;
 6     static private readonly object th_safe = new object();
 7     static public T Instance
 8     {
 9         get
10         {
11             if (_instance == null)
12             {
13                 lock (th_safe)
14                 {
15                     if (_instance == null)
16                         //_instance = new T();
17                         _instance = (T) Activator.CreateInstance(typeof(T), true);
18                 }
19             }
20             return _instance;
21         }
22     }
23 }

 

posted @ 2017-11-12 11:21  非法关键字  阅读(692)  评论(0编辑  收藏  举报