单例模式

来源:互联网 发布:google python style 编辑:程序博客网 时间:2024/05/17 04:15
在Unity3D中可以用不同的方法来实现单例,第一种是通常用法,第二种是自我包含法,第三种方法粗制滥造法,第四种是为C#开发者准备的,计数器法。
1.通常用法
     通常用法是在相关类加入GetInstance()的静态方法,检查实例是否存在。如果存在,则返回。如果不存在,则返回一个“需要用游戏元素类关联”的调试警告错误.
Java代码  收藏代码
  1. public class MyClass    
  2. {    
  3.      private static MyClass instance;    
  4.      public static MyClass GetInstance()    
  5.      {    
  6.          if (!instance)    
  7.          {    
  8.              instance = GameObject.FindObjectOfType(typeof(MyClass));    
  9.              if (!instance)    
  10.                 Debug.LogError("There needs to be one active MyClass script on a GameObject in your scene.");    
  11.          }    
  12.          return instance;    
  13.      }    
  14. }   

2.自我包含法
     有一次玩Trench Run game,我意识到我的场景类里存在许多的GameObject。所以,我开发了自我包含的单例。如果没找找到实例,就会创建它自己的GameObject,注重通过AddComponent()方法返回来关联实例类,而不需要在IDE中创建一个GameObject在设计时弄乱你的场景。
Java代码  收藏代码
  1. public class Logger : MonoBehaviour    
  2. {    
  3.     private static Logger instance;    
  4.     private static GameObject container;    
  5.     public static Logger GetInstance()    
  6.     {    
  7.         if( !instance )    
  8.         {    
  9.             container = new GameObject();    
  10.             container.name = "Logger";    
  11.             instance = container.AddComponent(typeof(Logger)) as Logger;    
  12.         }    
  13.         return instance;    
  14.     }    
  15. }   

3.粗制滥造法
    粗制滥造法很简单,为实例设置一个公共静态属性,初始化Awake()方法,设计时关联一个GameObject. 可以用以下方法访问:
Java代码  收藏代码
  1. MyClass.instance.DoSomething();  
  2. public class MyClass    
  3. {    
  4.     public static MyClass instance;    
  5.     public void Awake()    
  6.     {    
  7.         MyClass.instance = this;    
  8.     }    
  9. }   

在ActionScript里访问外在类的其他方法比访问一个属性要慢很多,我不知道这是否属实(我怀疑),但是在过去几年里我在Flash上噩梦般的优化,我通常用的是这种方法。也许有些习惯永远也改不了的!(或者我本来就偏执于此)
4.计数器法
    以上的第一种方法和第二种方法得利于使用访问器而不是一个方法。关于本提示要感谢Cliff Owen.
Java代码  收藏代码
  1. public class MyClass    
  2. {    
  3.     private static MyClass _instance;    
  4.     public static MyClass Instance    
  5.     {    
  6.         get  
  7.         {    
  8.             if (!_instance)    
  9.             {    
  10.                 _instance = GameObject.FindObjectOfType(typeof(MyClass));    
  11.                 if (!_instance)    
  12.                 {    
  13.                     GameObject container = new GameObject();    
  14.                     container.name = "MyClassContainer";    
  15.                     _instance = container.AddComponent(typeof(MyClass)) as MyClass;    
  16.                 }    
  17.             }    
  18.             return _instance;    
  19.         }    
  20.     }    
  21. }   


然后你就可以用以下方士简单而粗制滥造的访问它:
Java代码  收藏代码
  1. MyClass.Instance.DoSomething(); 
0 0
原创粉丝点击