设计模式-大话设计模式总结-创建型->单例

点评

这一定是被大家用烂的设计模式,思想很简单-“构造方法私有化”,在类的生命周期中只有一个实例,对的怎么用都是他。
#从使用者的角度讲单例似乎和静态类类似,他们好像只是名词不一样,他们有什么区别?
想说下区别: 1)单例更讲究对象的属性,可以用来保存对象特有的属性;静态类更讲究方法 2)单例可以方便的继承和初始化;静态类就不是很好初始化,或者说不是那么直观的实现初始化工作。
#什么时候使用单例?什么时候使用静态类?
1)当你要维护一些生命周期,或者会保存状态属性,使用单例。编程中你往往看到很多xxxManager的代码,原因在此。 2)当你只是想提供一些通用的方法,他们不保存状态,使用静态类。编程中你往往会看到很多 xxxutil之类的工具类。

在c#等支持泛型的语言中我们可以编写一个泛型单例基类,能省去很多繁琐的单例创建工作。我们给出Unity中比较典型泛型单例,它真的很使用!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public abstract class MonoSingleton<T> : MonoBehaviour where T : Component
{
private static T m_instance = null;
public static T Instance
{
get
{
GameObject go = GameObject.Find("$MonoSingleton");
if (go == null)
{
go = new GameObject("$MonoSingleton");
}
if (!go.IsDestroyed())
{
DontDestroyOnLoad(go);
}

if (m_instance == null)
{
GameObject child = new GameObject(typeof(T).Name);
GameObject.DontDestroyOnLoad(child);
child.transform.SetParent(go.transform);
m_instance = child.AddComponent<T>();
}
return m_instance;
}
}

void Awake()
{
OnInit();
}


public virtual void OnInit()
{

}
}
#使用示例:
1
2
3
public class UIManager:MonoSingleton<UIManager>{...}
public class EffectManager:MonoSingleton<EffectManager>{...}
public class ResourcesManager:MonoSingleton<ResourcesManager>{...}