C# & Unity 面向对象补全计划 之 单例模式
创始人
2024-11-10 00:07:34
0

本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正
本系列作为七大原则和设计模式的进阶知识,看不懂没关系

了解我的专栏C#面向对象与进阶:http://t.csdnimg.cn/mIitr,尤其是关于类的那篇文章即可,另外尤其需要注意的点就是,类的成员属性可以get和set类对象,只是很少这么举例

首先,单例模式可以理解为只有一个外部访问口的类,是在类的概念上设计的

1.单例模式介绍

      单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点来访问这个实例,它在需要控制资源的访问或确保某些操作只执行一次的场景中非常有用

  也就是说,单例模式不能在类外部去创建新实例,就是不能"new"

特点

分类

一级分类

根据实例创建的时刻分类,可以理解为一级分类

二级分类 

根据优缺点分类,可以理解为建立在一级分类上的二级分类

静态变量初始化:这是饿汉式(Eager Initialization),因为实例在类加载时就已经创建

双重检查锁定:这是懒汉式(Lazy Initialization),因为实例是在第一次需要时才创建,并且通过双重检查锁定来确保线程安全

Lazy:这是懒汉式(Lazy Initialization),因为实例是在第一次需要时才创建,并且使用了 Lazy 类来确保线程安全和延迟加载

2.举栗子

说那么多分类,其实会写会用就行,哪那么多弯弯绕绕的,又不是去考研

 静态变量初始化

注意,实例已经在类中被创建,所以叫饿汉=迫不及待需求对象

// 静态变量初始化 A a = A.Instance; a.func();  public class A  {     //单例模式     //1.私有构造函数     private A() { }     //2.私有静态唯一实例     private static A instance = new A();     //3.唯一对外开放的公共属性     public static A Instance => instance;      public void func() {         Console.WriteLine("这是一个单例模式");     } }

优化方面: 可以设置密封类,并对唯一实例设置为只读状态

sealed 
readonly 

双重检查锁定

        要想实现,懒汉式=对象需要的时候才创建一个,需要objcet的帮忙,其实总的来讲就比静态变量初始化多出一个静态字段和双重锁的逻辑

public class A {     //1.私有静态字段     private static A instance = null;     //2.私有唯一实例,但是这个实例是objcet的     private static object obj = new object();     //3.私有构造函数     private A() {     }     //4.唯一对外开放的公共属性     public static A Instance {         get {             if (instance == null) {                 lock (obj) {                     if (instance == null) {                         instance = new A();                     }                 }             }             return instance;         }     } }

Lazy

        看到这个大大的T了没有,就是本质上就是泛型类

B b = A.Instance; b.Func(); public class A //where T :new() ()=>new()     {     //1.私有静态唯一实例     private static Lazy instance = new Lazy();     //2.公共外部属性     public static T Instance => instance.Value;     //3.私有构造函数     private A() { } } public class B     {      public void Func()         {         Console.WriteLine("单例模式的使用");      } }

Q.为什么是instance.Value而不是instance?

A: 因为泛型T的原因,导致instance像是一个对象盒子,而不是属性Instance需要返回的盒子里面的东西

进阶版本:

public class A where T :new()      {     //1.私有静态唯一实例     private static Lazy instance = new Lazy(() => new());     //2.公共外部属性     public static T Instance => instance.Value;     //3.私有构造函数     private A() { } }

相关内容

热门资讯

一分钟推荐“微信上玩炸金花详细... 新永和是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:15984933许多玩家在游戏中会购买房卡来享...
分享!创建微信链接炸金花房卡/... 微信游戏中心:炸金花房卡,添加微信【33699510】,进入游戏中心或相关小程序,搜索“微信炸金花房...
两秒就懂!微信牛牛房间卡在哪买... 微信游戏中心:牛牛房卡,添加微信【66336574】,进入游戏中心或相关小程序,搜索“微信牛牛房卡”...
微信链接金花房卡怎么弄/微信里... 金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:15984933许多玩家在游戏中会购买房卡来享受...
两秒就懂!正版玩牛牛购买房卡,... 微信游戏中心:斗牛房卡,添加微信【71319951】,进入游戏中心或相关小程序,搜索“微信斗牛房卡”...
微信金花房卡链接使用方法/可以... 牛牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:15984933许多玩家在游戏中会购买房卡来享受...
分享!拼三张链接房卡怎么搞/新... 微信游戏中心:拼三张房卡,添加微信【33699510】,进入游戏中心或相关小程序,搜索“微信拼三张房...
两秒就懂!我买拼三张房卡链接,... 微信游戏中心:拼三张房卡,添加微信【56001354】,进入游戏中心或相关小程序,搜索“微信拼三张房...
ia实测“微信金花房房卡怎么弄... 金牛座金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:44346008许多玩家在游戏中会购买房卡...
两秒就懂!微信炸金花房卡怎样开... 微信游戏中心:炸金花房卡,添加微信【66336574】,进入游戏中心或相关小程序,搜索“微信炸金花房...
微信炸金花房间在哪建房/微信炸... 微信炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:15984933许多玩家在游戏中会购买房卡...
分享!炸金花在哪买房卡/微信里... 微信游戏中心:炸金花房卡,添加微信【33699510】,进入游戏中心或相关小程序,搜索“微信炸金花房...
两秒就懂!拼三张如何开好友房间... 微信游戏中心:拼三张房卡,添加微信【71319951】,进入游戏中心或相关小程序,搜索“微信拼三张房...
可以自己开房炸金花房卡哪里买/... 斗牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:160470940许多玩家在游戏中会购买房卡来享...
微信金花房卡找谁拿/微信链接牛... 牛牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:44346008许多玩家在游戏中会购买房卡来享受...
两秒就懂!微信拼三张房间卡在哪... 微信游戏中心:拼三张房卡,添加微信【56001354】,进入游戏中心或相关小程序,搜索“微信拼三张房...
分享!微信群牛牛房卡到哪里买/... 微信游戏中心:牛牛房卡,添加微信【33699510】,进入游戏中心或相关小程序,搜索“微信牛牛房卡”...
两秒就懂!微信牛牛房卡链接去哪... 微信游戏中心:牛牛房卡,添加微信【66336574】,进入游戏中心或相关小程序,搜索“微信牛牛房卡”...
金花游戏房卡怎么获得最简单方法... 牛牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:86909166许多玩家在游戏中会购买房卡来享受...
分享!炸金花房间如何购买房卡/... 微信游戏中心:炸金花房卡,添加微信【33699510】,进入游戏中心或相关小程序,搜索“微信炸金花房...