C# 设计模式系列教程-单例模式

对于单例模式的详细讲解可以分成以下几个部分:

什么是单例模式?

单例模式是一种创建型的设计模式,用于保证某一个类仅有一个实例,并提供全局的访问点。

通常情况下,我们可以通过类创建多个对象,但是有时候我们需要只创建一个对象,比如全局的配置、日志等。这时候单例模式就派上用场了。

如何实现单例模式?

实现单例模式有多种方式,以下是其中比较常用的几种:

饿汉式单例模式

饿汉式单例模式指在类加载的时候就创建了一个对象,以后每次调用获取对象的方法,都返回同一个对象。

public class Singleton1
{
    private static Singleton1 _instance = new Singleton1();

    private Singleton1() {}

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

懒汉式单例模式

懒汉式单例模式指在调用获取对象的方法时,才创建对象。这种方式相对于饿汉式单例模式,可以延迟对象的创建时间。但是需要考虑线程安全的问题。

public class Singleton2
{
    private static Singleton2 _instance;

    private Singleton2() {}

    public static Singleton2 GetInstance()
    {
        if (_instance == null)
        {
            _instance = new Singleton2();
        }

        return _instance;
    }
}

需要注意的是,懒汉式单例模式在多线程下存在线程安全的问题。一种解决方案是使用双重锁定来实现。

public class Singleton3
{
    private static Singleton3 _instance;
    private static readonly object _lock = new object();

    private Singleton3() {}

    public static Singleton3 GetInstance()
    {
        if (_instance == null)
        {
            lock (_lock)
            {
                if (_instance == null)
                {
                    _instance = new Singleton3();
                }
            }
        }

        return _instance;
    }
}

枚举式单例模式

枚举式单例模式指通过枚举类型来实现单例模式。枚举类型只能有一个实例,因此可以用来实现单例模式。

public enum Singleton4
{
    Instance
}

单例模式的优点和缺点

单例模式的优点在于:

  • 可以确保某个类只有一个实例,节省系统资源。
  • 对象只在第一次被访问时被初始化,减少了类加载的时间,提高了系统性能。
  • 提供了对唯一实例的访问,方便了系统的统一管理。

单例模式的缺点在于:

  • 单例模式没有抽象层,扩展困难。
  • 单例模式要求在访问时必须先获取单例对象,然后才能调用方法,使代码调用复杂度提高。
  • 单例模式可能引起单例对象长时间占用内存,造成内存泄漏问题。

示例说明

下面以在ASP.NET Core Web API中使用单例模式为例,说明如何实现单例模式。

首先,我们创建一个接口,用于定义单例对象的方法。

public interface IMySingleton
{
    void Run();
}

然后,我们创建一个单例对象的实现类。

public class MySingleton : IMySingleton
{
    private int _count;

    public void Run()
    {
        Console.WriteLine("MySingleton is running. Count:{0}", ++_count);
    }
}

接下来,我们通过懒汉式单例模式来实现获取单例对象的方法。由于ASP.NET Core Web API默认支持依赖注入(DI),因此我们可以在Startup.cs文件中进行配置。

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IMySingleton, MySingleton>();
}

最后,在代码中使用依赖注入来获取单例对象。

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
    private readonly IMySingleton _mySingleton;

    public WeatherForecastController(IMySingleton mySingleton)
    {
        _mySingleton = mySingleton;
    }

    [HttpGet]
    public IActionResult Get()
    {
        _mySingleton.Run();
        return Ok();
    }
}

这样,每次调用Get方法时,都会获取到同一个MySingleton对象,并且每次调用MySingleton的Run方法,都会增加计数器的值,以此说明MySingleton对象只创建了一次,实现了单例模式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# 设计模式系列教程-单例模式 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • C#正则表达式之Ismatch()的用法解读

    我将分为以下几个部分逐步讲解: 什么是正则表达式 C#中的正则表达式 Ismatch()方法的用法解读 示例说明 结论 1. 什么是正则表达式 正则表达式是一种用来匹配字符串、验证用户输入、替换文本等操作的强大工具。它基于一些特殊字符和语法规则,可以完成一些模糊匹配、字符替换、文本搜索等任务。在实际开发中,正则表达式被广泛应用于文本处理、表单验证、网页爬虫等…

    C# 2023年6月8日
    00
  • ASP.NET MVC Webuploader实现上传功能

    ASP.NET MVC是一个基于ASP.NET框架的Web应用程序开发框架,它通过模型、视图和控制器的分离,实现了高内聚低耦合、易维护易扩展的设计。Webuploader是一个基于HTML5的前端文件上传插件,支持大文件分片上传、图片压缩、进度提示等功能。本文将介绍如何使用ASP.NET MVC和Webuploader实现文件上传功能。 1. 创建ASP.N…

    C# 2023年5月15日
    00
  • 深入理解JavaScript系列(18):面向对象编程之ECMAScript实现

    深入理解JavaScript系列(18):面向对象编程之ECMAScript实现 什么是面向对象编程(OOB) 面向对象编程是一种常见的编程范式,也是JavaScript编程中一个重要的概念。它将程序中的数据和方法组织为对象,使得程序具有更好的可读性、可复用性和可维护性。 面向对象编程中的关键点包括:封装、继承和多态。封装是指将数据和方法封装到一个对象中,并…

    C# 2023年6月8日
    00
  • C#中泛型容器Stack的用法并实现”撤销/重做”功能

    以下是详细讲解“C#中泛型容器Stack的用法并实现”撤销/重做”功能”的完整攻略。 Stack的用法 Stack是C#中的泛型容器,用于实现“栈”这种数据结构。其中T代表栈中存储的元素类型。 Stack主要支持以下几种常用操作: Push(T item):将一个元素压入栈中 Pop():将栈顶的元素弹出并返回 Peek():返回栈顶的元素但不弹出 Clea…

    C# 2023年5月15日
    00
  • C#标识符的使用小结

    我将详细讲解 “C#标识符的使用小结”: 什么是标识符? 在C#编程语言中,标识符是用来表示各种元素名称(如变量、方法、命名空间等)的一个字符序列。合法的标识符必须符合以下规则: 标识符由字母、数字或下划线(_)组成 第一个字符必须是字母或下划线 标识符不能与C#语言的关键字(如if、for等)相同 标识符区分大小写 命名规范 在使用标识符时应遵循以下规范:…

    C# 2023年5月31日
    00
  • c#的dataset离线数据集示例

    下面是“C#的dataset离线数据集示例”的完整攻略: 什么是 dataset? dataset是C#语言中数据存储和管理的一种对象,它可以在离线状态下对数据进行操作,而不需要一直与数据库保持连接。使用dataset可以查询、修改、删除和插入数据等操作。dataset由多个DataTable组成,每个DataTable代表一个数据表格。 创建 datase…

    C# 2023年6月2日
    00
  • C#实现给图片添加日期信息的示例详解

    我们来详细讲解“C#实现给图片添加日期信息的示例详解”。 目录 示例1:使用ExifLib库读取图片信息 示例2:给图片添加日期信息 示例1:使用ExifLib库读取图片信息 首先,我们需要使用一个Exif库获取图片的元数据信息,这里我推荐使用ExifLib库。 以下是一个简单的示例,演示了如何使用ExifLib库读取图片的元数据信息: using Syst…

    C# 2023年6月1日
    00
  • .net C# 实现任意List的笛卡尔乘积算法代码

    以下是“.net C# 实现任意List的笛卡尔乘积算法代码”的完整攻略。 什么是笛卡尔积? 笛卡尔积,又称交叉积、叉积,是指对两个集合进行操作,其中一个集合中每一个元素都与另一个集合中的所有元素一一组合,生成一个新的集合。例如,集合 A={a,b},集合 B={0,1,2},A 和 B 的笛卡尔积是 {(a,0),(a,1),(a,2),(b,0),(b,…

    C# 2023年6月1日
    00
合作推广
合作推广
分享本页
返回顶部