2.C#设计模式系列01_单例模式_Singleton

前言:单例模式个人觉得是比较容易理解,而且面试比较容易遇到,但是在实际生产中要慎用的一种设计模式,以前总觉得很难,系统的了解了下,主要有以下几种写法

1.双if + lock 

复制代码
 1 public class SingletonModel {
 2 
 3         private static SingletonModel instance = null;
 4         private static object singleton_lock = new object();
 5         private SingletonModel() {
 6             Console.WriteLine("构造函数");
 7         }
 8 
 9         //多线程测试
10         public static SingletonModel SingletonCreatInstance() {
11             if (instance == null){
12                 lock (singleton_lock){
13                     if (instance == null){
14                         instance = new SingletonModel();
15                     }
16                 }
17             }
18             return instance;
19         }
20     }
复制代码

 

2.静态成员变量

复制代码
  public class SingletonTwo{

        private static SingletonTwo slModel = new SingletonTwo();
        private SingletonTwo() {
            Console.WriteLine("构造函数");
        }

        public static SingletonTwo CreateInstanceTwo{
            get{
                return slModel;
            }
        }
    }
复制代码

 

3.静态构造函数

复制代码
public class SingletonOne {

        //静态构造函数
        private static SingletonOne slModel =null;
        static SingletonOne(){
            slModel = new SingletonOne();
            Console.WriteLine("构造函数");
        }

        public static  SingletonOne CreateInstance() {
            return slModel;
        }
    }
复制代码

 

4.Lazy延时加载

复制代码
public class SingletonThree {
        private static Lazy<SingletonThree> lazyModel = new Lazy<SingletonThree>(() => new SingletonThree());
        private SingletonThree(){
        }

        public static SingletonThree CreatInstance() {
            return lazyModel.Value;
        }
    }
复制代码
复制代码
public class SingletonFour{

        private static Lazy<SingletonFour> lazyModel;
        private SingletonFour(){
        }

        static SingletonFour() {
            lazyModel = new Lazy<SingletonFour>(new SingletonFour());
        }

        public static SingletonFour CreatInstance() {
            return lazyModel.Value;
        }
    }
复制代码

 

总结:

套路无非就是  1.私有构造函数或者静态构造函数 + 2.私有静态成员变量  + 3.公共对外的访问实例方法 ,然后根据实际情况选择合适的用法

ps:Lazy 用法个人感觉使用静态成员变量和静态构造是一样的

 

posted @   Mark's.T  阅读(59)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示