当前位置: 首页 > news >正文

.NET 设计模式—单例模式(SingletonPattern)

简介

单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就非常适合。

优点

  • 单例模式可以保证在全局内存中只有一个实例,节省了系统资源。

  • 单例模式可以避免对资源的多重占用,例如一个写文件操作,为了保证数据不会发生冲突,必须确保只有一个实例在对它进行操作。

  • 单例模式可以提供一个全局访问点,对于一些需要频繁进行实例化和销毁的对象,单例模式可以提高系统性能。

缺点

  • 单例模式一般没有接口,扩展困难,若要扩展,除非修改原代码。

  • 单例模式对测试的支持不友好,因为它们是静态的,所以很难进行单元测试。

  • 如果在应用程序的不同模块中过度使用单例,可能会导致代码的耦合度高,难以调试和维护。

  • 单例模式可能会导致“单例依赖”情况,如果一个类依赖于单例服务,那么这个类在测试时可能很难被模拟或替换。

实现

  • 懒汉式:单例实例在第一次被使用时构建,延迟初始化(推荐使用)。
/// <summary>
/// 单例模式-懒汉式
/// </summary>
public class Singleton
{
    /// <summary>
    /// 可以把需要处理的逻辑放在构造函数中
    /// </summary>
    private Singleton()
    {

    }

    private static Singleton _instance = null;
    private static readonly object _lock = new object();
    public static Singleton GetInstance()
    {
        if (_instance == null)//为了提升性能,对象初始化之后能够并发
        {
            lock (_lock)//保证任意时刻只有一个线程可以进入
            {
                if (_instance == null)//这里用于第一次初始化时的并发判断,防止重复初始化
                {
                    _instance = new Singleton();
                }
            }
        }
        return _instance;
    }

}
  • 饿汉式1:单例实例在类装载时通过静态构造函数构建,急切初始化。(预先加载法)
/// <summary>
/// 单例模式-饿汉式
/// </summary>
public class SingletonSecond
{
    /// <summary>
    /// 可以把需要处理的逻辑放在构造函数中
    /// </summary>
    private SingletonSecond()
    {

    }

    private static SingletonSecond _instance = null;

    /// <summary>
    /// 由CLR调用,且只调用一次,会在程序第一次使用该类型之前
    /// </summary>
    static SingletonSecond()
    {
        _instance = new SingletonSecond();
    }

    public static SingletonSecond GetInstance()
    {
        return _instance;
    }
}
  • 饿汉式1:单例实例在类装载时通过静态字段构建,急切初始化。(预先加载法)
/// <summary>
/// 单例模式-饿汉式
/// </summary>
public class SingletonThird
{
    /// <summary>
    /// 可以把需要处理的逻辑放在构造函数中
    /// </summary>
    private SingletonThird()
    {

    }

    /// <summary>
    /// 静态字段也是由CLR保障的,在程序第一次使用该类型之前,完成初始化,且只初始化一次
    /// </summary>
    private static SingletonThird _instance = new SingletonThird();

    public static SingletonThird GetInstance()
    {
        return _instance;
    }
}

总结

懒汉式优点:

避免了饿汉式的那种在没有用到的情况下创建实例,资源利用率高,不执行GetInstance()就不会被实例,可以执行该类的其他静态方法。

懒汉式缺点:

多线程使用时一定要注意加锁+双if判断,第一次加载时不够快,多线程使用不必要的同步开销大。
 

饿汉式优点:

不存在多线程并发的问题,线程安全,在类加载的同时已经创建好一个静态对象,调用时反应速度快 。

饿汉式缺点:

 资源效率不高,可能GetInstance()永远不会执行到,但执行该类的其他静态方法,那么这个实例仍然初始化 。

 

相关文章:

  • 【Python】文件操作和异常
  • 系统地自学Python的步骤与策略
  • Git安装教程(图文安装)
  • 【经典算法】LeetCode350:两个数组的交集 II(Java/C/Python3/JavaScript实现含注释说明,Easy)
  • Flutter Engine引擎概念
  • Filter
  • 设计模式面试题(六)
  • 设计模式:观察者模式示例
  • Linux------一篇博客了解Linux最常用的指令
  • Doris实践——信贷系统日志分析场景的实践应用
  • C++ //练习 11.18 写出第382页循环中map_it的类型,不要使用auto或decltype。
  • V3+TS(基础知识详解)
  • Golang学习系列1-pprof性能调优
  • TypeScript基础知识
  • dm8 备份与恢复
  • 世优科技上榜2024年度《中国虚拟数字人影响力指数报告》
  • 如何从vue项目界面上看出来node.js版本
  • 练习 16 Web [极客大挑战 2019]LoveSQL
  • SpringBoot3整合RabbitMQ之一_消息生产者与消息消费者服务搭建
  • Vue之列表渲染
  • 万达电影去年净利润亏损约9.4亿元,计划未来三年内新增25块IMAX银幕
  • 中央网信办部署开展“清朗·整治AI技术滥用”专项行动
  • 4月译著联合书单|心爱之物:热爱如何联结并塑造我们
  • 昆明破获一起算命破灾诈骗案,民警:大师算不到自己的未来
  • 日趋活跃!2024年我国数据生产总量同比增长25%
  • 国家能源局:支持民营企业参股投资核电项目