Unity3D 里的单例模式
2014-04-09 17:27
204 查看
单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。
单例模式(singleton)顾名思义,就是只有一个实例。
作为对象的创建模式[GOF95], 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。
单例模式的要点
显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。在下面的对象图中,有一个"单例对象",而"客户甲"、"客户乙" 和"客户丙"是单例对象的三个客户对象。可以看到,所有的客户对象共享一个单例对象。而且从单例对象到自身的连接线可以看出,单例对象持有对自己的引用。
在Unity3D中可以用不同的方法来实现单例,第一种是通常用法,第二种是自我包含法,第三种方法粗制滥造法,第四种是为C#开发者准备的,计数器法。
1.通常用法
通常用法是在相关类加入GetInstance()的静态方法,检查实例是否存在。如果存在,则返回。如果不存在,则返回一个“需要用游戏元素类关联”的调试警告错误.
public class MyClass
{
private static MyClass instance;
public static MyClass GetInstance()
{
if (!instance)
{
instance = GameObject.FindObjectOfType(typeof(MyClass));
if (!instance)
Debug.LogError("There needs to be one active MyClass script on a GameObject in your scene.");
}
return instance;
}
}
2.自我包含法
有一次玩Trench Run game,我意识到我的场景类里存在许多的GameObject。所以,我开发了自我包含的单例。如果没找找到实例,就会创建它自己的GameObject,注重通过AddComponent()方法返回来关联实例类,而不需要在IDE中创建一个GameObject在设计时弄乱你的场景。public class Logger : MonoBehaviour
{
private static Logger instance;
private static GameObject container;
public static Logger GetInstance()
{
if( !instance )
{
container = new GameObject();
container.name = "Logger";
instance = container.AddComponent(typeof(Logger)) as Logger;
}
return instance;
}
}
3.粗制滥造法
粗制滥造法很简单,为实例设置一个公共静态属性,初始化Awake()方法,设计时关联一个GameObject. 可以用以下方法访问:
MyClass.instance.DoSomething();
public class MyClass
{
public static MyClass instance;
public void Awake()
{
MyClass.instance = this;
}
}
在ActionScript里访问外在类的其他方法比访问一个属性要慢很多,我不知道这是否属实(我怀疑),但是在过去几年里我在Flash上噩梦般的优化,我通常用的是这种方法。也许有些习惯永远也改不了的!(或者我本来就偏执于此)
祝你愉快!
4.计数器法
以上的第一种方法和第二种方法得利于使用访问器而不是一个方法。关于本提示要感谢Cliff Owen.
public class MyClass
{
private static MyClass _instance;
public static MyClass Instance
{
get
{
if (!_instance)
{
_instance = GameObject.FindObjectOfType(typeof(MyClass));
if (!_instance)
{
GameObject container = new GameObject();
container.name = "MyClassContainer";
_instance = container.AddComponent(typeof(MyClass)) as MyClass;
}
}
return _instance;
}
}
}
然后你就可以用以下方士简单而粗制滥造的访问它:
MyClass.Instance.DoSomething();
单例模式(singleton)顾名思义,就是只有一个实例。
作为对象的创建模式[GOF95], 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。
单例模式的要点
显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。在下面的对象图中,有一个"单例对象",而"客户甲"、"客户乙" 和"客户丙"是单例对象的三个客户对象。可以看到,所有的客户对象共享一个单例对象。而且从单例对象到自身的连接线可以看出,单例对象持有对自己的引用。
在Unity3D中可以用不同的方法来实现单例,第一种是通常用法,第二种是自我包含法,第三种方法粗制滥造法,第四种是为C#开发者准备的,计数器法。
1.通常用法
通常用法是在相关类加入GetInstance()的静态方法,检查实例是否存在。如果存在,则返回。如果不存在,则返回一个“需要用游戏元素类关联”的调试警告错误.
public class MyClass
{
private static MyClass instance;
public static MyClass GetInstance()
{
if (!instance)
{
instance = GameObject.FindObjectOfType(typeof(MyClass));
if (!instance)
Debug.LogError("There needs to be one active MyClass script on a GameObject in your scene.");
}
return instance;
}
}
2.自我包含法
有一次玩Trench Run game,我意识到我的场景类里存在许多的GameObject。所以,我开发了自我包含的单例。如果没找找到实例,就会创建它自己的GameObject,注重通过AddComponent()方法返回来关联实例类,而不需要在IDE中创建一个GameObject在设计时弄乱你的场景。public class Logger : MonoBehaviour
{
private static Logger instance;
private static GameObject container;
public static Logger GetInstance()
{
if( !instance )
{
container = new GameObject();
container.name = "Logger";
instance = container.AddComponent(typeof(Logger)) as Logger;
}
return instance;
}
}
3.粗制滥造法
粗制滥造法很简单,为实例设置一个公共静态属性,初始化Awake()方法,设计时关联一个GameObject. 可以用以下方法访问:
MyClass.instance.DoSomething();
public class MyClass
{
public static MyClass instance;
public void Awake()
{
MyClass.instance = this;
}
}
在ActionScript里访问外在类的其他方法比访问一个属性要慢很多,我不知道这是否属实(我怀疑),但是在过去几年里我在Flash上噩梦般的优化,我通常用的是这种方法。也许有些习惯永远也改不了的!(或者我本来就偏执于此)
祝你愉快!
4.计数器法
以上的第一种方法和第二种方法得利于使用访问器而不是一个方法。关于本提示要感谢Cliff Owen.
public class MyClass
{
private static MyClass _instance;
public static MyClass Instance
{
get
{
if (!_instance)
{
_instance = GameObject.FindObjectOfType(typeof(MyClass));
if (!_instance)
{
GameObject container = new GameObject();
container.name = "MyClassContainer";
_instance = container.AddComponent(typeof(MyClass)) as MyClass;
}
}
return _instance;
}
}
}
然后你就可以用以下方士简单而粗制滥造的访问它:
MyClass.Instance.DoSomething();
相关文章推荐
- Unity3D -- 编辑器模式打开unity导出的应用程序
- Unity3D与设计模式(一)先从OO和设计模式讲起
- [unity3D基础篇05]重要的设计模式 - 观察者模式(Observer) Event/Delegate
- Unity3d程序必备的几种设计模式
- Unity3D_单例设计模式
- UNITY3D shader学习心得<四> 贴图Fiter mode过滤器模式
- 游戏开发设计模式之对象池模式(unity3d 示例实现)
- 【浅墨Unity3D Shader编程】之七 静谧之秋篇: 表面着色器的写法(二)—— 自定义光照模式
- Unity3D - 单例模式和静态类模板
- Unity3d基于订阅者模式实现事件机制_解决装箱拆箱问题和注册的监听事件单一问题
- Unity3D的单例模式实现
- 一个优秀的Unity3d开发者必备的几种设计模式
- unity3D学习笔记之六 Material(材质)的几种RenderingMode(渲染模式)
- Unity3d与设计模式(二)单例模式
- Unity3D_状态模式
- unity3d中的设计模式之<单例模式>
- unity3d Ugui 5.x学习GridLayoutGroup 脚本创建预设并改变外面容器的大小及单例模式
- unity3d中设计模式的学习<一>:泛型单例
- Unity教程之-Unity3d中基于订阅者模式实现事件机制
- Unity3d 载入 C++/CLI (托管模式c++) 的动态库(DLL)