在我写Unity读写Exce插件的时候,有用到一个需要使用单例模式的Manager类,但是我几乎忘记了单例的写法,只记得最简单的写法。声明一个私有的静态字段、一个公开的静态属性,然后为了让团队里的脑残不去new单例,我们需要将类的构造函数个私有化。代码像这样:
public class Singleton{
private static Singleton instance = new Singleton();
publi static Singleton Instace=>instance;
private Singleton(){}
}
但是这样很低级,所以我们引入一下两种比较常用的单例模式。
1.懒汉式单例模式:
我们为了体现出OOP的思维,应该先声明一个接口,接口中应该只有一个Init方法
// 单例接口
public interface ISingleton { void Init(); }
然后声明一个抽象泛型类,约束T只能继承自ISingleton接口,然后其中一个私有静态字段,一个公开静态属性。在属性的get访问器中,若instance为空,则使用Lazy<T>new一个对象出不来,虽然已经声明了对象,但是实际上只有在使用T对象的时候,才会去创建这个对象。这个就是懒汉式单例模式的核心。
using System;
public interface ISingleton {
void Init();
}
public abstract class Singleton<T> where T:ISingleton
{
private static T? instance;
public static T Instance
{
get {
if (instance==null)
{
instance = new Lazy<T>(true).Value;
instance.Init();
}
return instance;
}
}
}
public class SingletonTest : ISingleton
{
public static SingletonTest Single =>Singleton<SingletonTest>.Instance;
void ISingleton.Init()
{
}
}
2.饿汉式单例模式
饿汉模式的核心就是一开始就创建,代码如下,用法和懒汉式单例模式用法相同。
public abstract class Singleton_Hunger<T> where T:ISingleton,new(){
private static T instance = new T();
public static T Instace {
get {
instance.Init();
return instance;
}
}
}
懒汉式与饿汉式的区别就是在于懒汉式只有在初始化的时候才会去创建实例,而饿汉式不管会不会用上,一开始就会创建实例。而至于为什么会继承一个接口而不是一个抽象类或者别的什么,其原因就是在于C#语言是不允许多继承,如果一个功能写成一个类的话,一个需要这个功能的类继承了父类,如果说还想要在其上面添加其他的功能就无法添加了,所以我们希望能够把一个功能组成一个接口,需要就继承这个接口,这更加符合框架的设计。
以上就是Unity非Mono单例的实现。