zoukankan      html  css  js  c++  java
  • .NET单例模式快速学习应用

    单例模式属于设计模式中最简单的一个模式,在实际应用中也非常广泛,但可能是受到各类教程的影响,看到很多实现方式仍然沿用Java的那一套,其实在.NET中可以用更简洁的实现方式。

    一、知识点介绍

    核心目标:为了项目各处调用的都是同一个实例对象,从而实现资源共享。例如环境变量。

    常见的实现方式:饿汉模式、懒汉模式、双锁模式、延迟加载模式

    二、实现方式

    /// <summary>
    /// 饿汉模式,每次都加载会造成资源浪费
    /// </summary>
    public class EagerSingleton
    {
        public static Demo Instance { get; } = new Demo();
    }
    /// <summary>
    /// 懒汉模式,适用于没有多线程的简单应用
    /// </summary>
    public class LazySingleton
    {
        private static Demo _instance = null;
        public static Demo Instance
        {
            get
            {
                if (_instance == null)
                    _instance = new Demo();
                return _instance;
            }
        }
    }
    /// <summary>
    /// 线程安全
    /// </summary>
    public class ThreadSafeSingleton
    {
        private static Demo _instance = null;
        private static readonly object _lock = new object();
        public static Demo Instance
        {
            get
            {
                if (_instance == null)
                {
                    lock (_lock)
                    {
                        if (_instance == null)
                            _instance = new Demo();
                    }
                }
                return _instance;
            }
        }
    }
    /// <summary>
    /// 延迟加载,利用静态类访问即创建的特点,兼顾易用性和线程安全的最佳实践
    /// </summary>
    public class DelaySingleton
    {
        /// <summary>
        /// 内部静态类
        /// </summary>
        static class Nested
        {
            internal static readonly Demo Instance = new Demo();
        }
    
        public static Demo Instance => Nested.Instance;
    }

    调用方式

    static void Main(string[] args)
    {
        ThreadPool.SetMaxThreads(25, 25);// 调整最大线程数
        ThreadPool.SetMinThreads(10, 10);// 调整最小线程数
    
        Console.WriteLine("========== 示例:饿汉模式的多线程 ==========");
        Parallel.For(0, 10, (i) =>
        {
            Console.WriteLine($"{EagerSingleton.Instance.Id} ");
        });
    
        Console.WriteLine();
        Console.WriteLine("========== 示例:懒汉模式的多线程 ==========");
        Parallel.For(0, 10, (i) =>
        {
            Console.WriteLine($"{LazySingleton.Instance.Id} ");
        });
    
        Console.WriteLine();
        Console.WriteLine("========== 示例:线程安全模式的多线程 ==========");
        Parallel.For(0, 10, (i) =>
        {
            Console.WriteLine($"{ThreadSafeSingleton.Instance.Id} ");
        });
    
        Console.WriteLine();
        Console.WriteLine("========== 示例:延迟加载模式的多线程 ==========");
        Parallel.For(0, 10, (i) =>
        {
            Console.WriteLine($"{DelaySingleton.Instance.Id} ");
        });
    
        Console.ReadKey();
    }
    
    public class Demo
    {
        public string Id { get; private set; }
        public Demo() { Id = Guid.NewGuid().ToString(); }
    }

    调用结果:

    三、结论

    饿汉模式适用于初学者,简单易记,但是没有考虑资源占用。

    懒汉模式也适用于初学者,也简单易记,考虑了资源占用,但是没有考虑线程安全。

    双锁模式兼顾了实用性和线程安全,实现比较繁琐,是以前比较常用的方式,比较直观好理解。

    延迟加载模式,兼顾了易用性、简洁和线程安全,需要理解静态类的初始化机制,这种实现方式目前是最优解

    > 单例模式不要实现 ICloneable 接口,不要涉及序列化,否则就会出现多个对象。

     四、参考资料

    设计模式的征途—1.单例(Singleton)模式

    C# 单例模式的五种写法

  • 相关阅读:
    dapper 批量删除、新增、修改说明
    android 加载assets目录下的静态html文件案例
    webstorm中使用git提交代码时出现unversioned files错误
    windows server 2008 R2 x64 部署.net core 3.1项目
    asp.net core 项目添加nlog日志(loggerFactor.AddNLog 过时处理(.net core 3.1))
    机器学习笔记之一步步教你轻松学主成分分析PCA降维算法
    机器学习笔记之类别特征处理
    机器学习笔记之range, numpy.arange 和 numpy.linspace的区别
    机器学习笔记之Numpy的random函数
    机器学习笔记之矩阵分解 SVD奇异值分解
  • 原文地址:https://www.cnblogs.com/yokeqi/p/11888362.html
Copyright © 2011-2022 走看看