几种单例模式

单例模式

概念:
单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。

关键点:

1)一个类只有一个实例 这是最基本的
2)它必须自行创建这个实例
3)它必须自行向整个系统提供这个实例

C#的单例:

1.饿汉模式:

public class Person
{
    //饿汉模式,在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快
    static Person person = new Person();
    public static Person Instance()
    {
        return person;
    }
}

2.懒汉模式:

public class Person
{
    //懒汉模式,比较懒,在类加载时,不创建实例,用到时再创建,因此类加载速度快,但运行时获取对象的速度慢
    static Person instance;
    public static Person Instance()
    {
        if (instance==null)
        {
            instance = new Person();
        }
        return instance;
    }
}

Unity单例:

public class Person:MonoBehaviour
{
    //unity单例,脚本需挂在场景物体上
    public static Person Instace;
    //要在初始化时赋值(一般在Awake里赋值,确保在第一时间被初始化,以免在使用时为完成初始化赋值)
    private void Awake()
    {
        Instace = this;
    }
}

多线程单例:

    //当多个线程同时访问了Instance属性,并且两个线程对instance判断为空,两个都会new实例对象

     //会违背单例设计,可以使用Lock锁定资源(在cpu同一时刻有且只有一个线程可以访问子资源)

    //两个线程同时进入,会违背单例设计(某种意义上unity是支持多线程,只是非主线程很多Unity的API无法调用)

     //声明静态资源,供Lock字段锁住(当被锁资源被访问时就会被锁定,其他来访问时会自动等待)
 class Person
    {
        static object o = new object();
        static Person instance;
      public static Person Instance
        {
            get
            {
                lock (o)
                {
                    if (instance == null)
                    {
                        instance = new Person();
                    }
                    return instance;
                }
            }
        }
    }

泛型单例:

  // 当有多个单例类需要你定义时,可以定义一个泛型单例父类(被其他类继承成为单例类)
    //需要对T增加泛型修饰
    //泛型单例父类
    class SimpleMode<T> where T : new()//表示泛型类型 T 是可以被new
    {
        static T instance;
        public static T Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new T();
                }
                return instance;
            }
        }
    }
    //泛型单例子类
    class SimpleModeSon : SimpleMode<SimpleModeSon>
    {
        public void Print()
        {
            Console.WriteLine("单例");
        }
    } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值