对于一些管理的类,且只需要创建一次对象的类我们可以把它设置为单例模式
一、c#和unity中不继承MonoBehaviour如何实现单例模式:
1.在类中创建改类的静态私有对象并且初始化堆区空间
2.提供给外部一个静态的公共属性来获得改静态私有对象(只可以得不允许外部改,防止外部置空)
3.写一个私有的无参数的构造函数,顶掉公共的默认构造函数,这样外部不可以实例化对象了,就只可以通过公共的成员属性来得到唯一的类对象,
class Test
{
private static Test t = new Test();
public static Test T
{
get
{
return t;
}
}
private Test()
{
}
}
class Program
{
static void Main(string[] args)
{
//Test t = new Test();//顶掉了默认构造函数,也没有提供公共的构造函数,所以外部无法实例化对象
}
}
二、unity中继承MonoBehaviour的类怎么在父类中实现子类单例模式
//根据里氏替换原则,父类可以在的位置子类也可以在,即父类可以装载子类
1.所以泛型来创建子类的静态私有对象,但是继承了MonoBehaviour不用new来创建空间
2.提供给外部一个静态的公共属性来获得改静态私有对象(只可以得不允许外部改,防止外部置空)
3.由于继承了MonoBehaviour的类进入挂载了改脚本的对象的声明周期中所以在Awake中直接让私有的静态对象=当前对象并且通过as转为泛型,并且加上泛型约束,因为要使用as,保证是引用类型 where 泛型符号:class
public class singleinstance<T> : MonoBehaviour where T:class
{
private static T instance;
public static T Intance => instance;//简略写法省略了{}和return
private void Awake()
{
instance = this as T;
}
}
//4.子类继承该父类指定T为子类类型即可实现继承的子类的单例模式。(因为Awake其实相当于是父类的构造函数,在子类调用前先会调用父类的Awake方法,简单理解),后期通过子类类名.Intance可以访问到子类中的公共成员。
标签:实现,子类,模式,对象,单例,Test,父类,构造函数 From: https://blog.csdn.net/2401_84691335/article/details/142434406