优点:
- 内存在系统运行过程中只有一个实例,减少内存开销。
- 允许可变数目的实例
- 其他类通过唯一的全局实例,可以方便访问单例中的方法和变量。
- 单例可在第一次使用时候,进行实例化,不必在系统刚启动就初始化。一定程度上可以控制自己实例化进程。
缺点:
- 过多的其他类中通过单例访问全局方法和变量,可能跟其他类造成过度耦合。
- 没有接口扩展困难
- 过多的单例,造成性能问题
适用场景:
- 资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。
- 控制资源的情况下,方便资源之间的互相通信。如线程池等。
- 需要定义大量的静态常量和静态方法(如工具类)的环境,可以采用单例模式
Unity3d中实现单例泛型类方法:
public class UnitySingleton<T> : MonoBehaviour where T:Component {
private static T _instance;
public static T GetInstance()
{
if(_instance == null)
{
//如果没有类型为T的类对象
_instance = FindObjectOfType(typeof(T)) as T;
if(_instance == null)
{
GameObject tempObject = new GameObject ();
tempObject.hideFlags = HideFlags.HideAndDontSave;
_instance = (T) tempObject.AddComponent(typeof(T));
Object.DontDestroyOnLoad(tempObject);
}
}
return _instance;
}
}
某个类需要单例,继承即可,如下:
public class YourSelfScriptName :UnitySingleton<YourSelfScriptName>
{
}
单例模式比静态方法的优点:
从另一个角度考虑,如果一个方法和它所在类的实例对象无关,那么它就应该是静态的,否则就应该是非静态。因此像工具类,一般都是静态的。
- 单例可以继承类,实现接口,而静态类不能(可以集成类,但不能集成实例成员);
- 单例可以被延迟初始化,静态类一般在第一次加载是初始化;
- 单例类可以被集成,单例里边的方法可以被重写;
- 最重要的是,单例类可以被用于多态而无需强迫用户只假定唯一的实例。举个例子,你可能在开始时只写一个配置,但是以后你可能需要支持超过一个配置集,或者可能需要允许用户从外部从外部文件中加载一个配置对象,或者编写自己的。你的代码不需要关注全局的状态,因此你的代码会更加灵活(允许可变数目的实例)
参考:
https://blog.csdn.net/yupu56/article/details/54144262