单例模式:
定义:单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点。[DP]
通常我们可以使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的方法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。[DP]
类图:
对应代码:
class Singleton
{
private static Singleton _instance;
private Singleton() //将构造方法设为私有,外界无法利用new创建此类实例的可能
{
}
public static Singleton GetInstance()
{
if(null==_instance) //如果实例不存在就new一个新实例,否则返回已有的实例
{
_instance = new Singleton();
}
return _instance;
}
}
##unity3d中单例的应用
- 不在场景中创建物体,可以用来保存临时数据,可以用静态类替代
代码与上面相同:
public class Singleton {
private static Singleton _instance;
private Singleton() //将构造方法设为私有,外界无法利用new创建此类实例的可能
{
}
public static Singleton GetInstance()
{
if (null == _instance) //如果实例不存在就new一个新实例,否则返回已有的实例
{
_instance = new Singleton();
}
return _instance;
}
}
- 创建继承自MonoBehaviour的单例,调用时在场景中创建物体
public class UnitySingleton : MonoBehaviour
{
static UnitySingleton _instance;
public static UnitySingleton Instance {
get {
if (_instance == null)
{
GameObject obj = new GameObject("UnitySingleton");
DontDestroyOnLoad(obj); //保证在切换场景时不被销毁
_instance = obj.AddComponent<UnitySingleton>();
}
return _instance;
}
}
}
- 同样是继承自MonoBehaviour
public class UnitySingleton : MonoBehaviour
{
public static UnitySingleton _instance;
void Awake()
{
if(_instance==null)
{
_instance = this;
DontDestroyOnLoad(this);
}
else
{
Destroy(this);
}
}
}
第二种是在调用时才创建,第三种在游戏开始时就已经创建
创建单例泛型类:
public class SingletonManager<T> : MonoBehaviour
where T : Component
{
private static T _instance;
public static T Instance {
get {
if (_instance == null)
{
GameObject obj = new GameObject();
DontDestroyOnLoad(obj); //切换场景时不被销毁
_instance = obj.AddComponent<T>();
}
return _instance;
}
}
}
将单例类继承自该类即可
参考:
《大话设计模式》----程杰
http://blog.csdn.net/candycat1992/article/details/10960731