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#实现的字符串转MD5码函数实例

    C#实现字符串转MD5码函数的攻略 什么是MD5码? MD5码(也称为MD5哈希)是一种用于数据加密的技术,它将任意长度的消息通过运算生成一个128位的输出,通常用16进制的形式表示。MD5码在信息安全领域中广泛应用,例如在网站密码的存储和校验,文件数据的完整性验证等。 在C#中实现字符串转MD5码的函数 在C#中,我们可以使用System.Security…

    C# 2023年6月7日
    00
  • C#使用throw和throw ex抛出异常的区别介绍

    让我们来详细讲解“C#使用throw和throw ex抛出异常的区别介绍”。 概述 在C#中,当程序出现错误时,我们可以使用异常来标识错误并进行处理。C#中有两种方式来抛出异常:throw和throw ex。它们之间有什么不同呢?在本篇攻略中,我们将对它们的区别进行介绍。 throw throw关键字可以用来抛出一个异常。当使用throw抛出异常时,它会保留…

    C# 2023年6月6日
    00
  • C# 模式匹配完全指南

    C# 模式匹配完全指南 什么是 C# 模式匹配? C# 7.0 开始加入了一种新的特性,那就是模式匹配(Pattern Matching)。模式匹配的主要作用是用来匹配各种数据类型,从而简化我们的程序设计,并且让代码更加简洁易懂。 C# 模式匹配的类型 常量模式(Constant Patterns) 次类型模式(Type Patterns) 变量模式(Var…

    C# 2023年5月15日
    00
  • C# BinaryReader实现读取二进制文件

    下面是“C# BinaryReader实现读取二进制文件”的完整攻略: 1. 什么是BinaryReader BinaryReader是C#中的一个类,它可以帮助我们快速读取二进制文件中的数据。BinaryReader提供了一系列方法,以便我们能够读取基本类型的数据(如int、float、double等)和字符串等其他类型的数据。我们可以使用BinaryRe…

    C# 2023年6月1日
    00
  • c# 反射+自定义特性保存数据至本地

    根据你的需求,我来详细讲解一下“c# 反射+自定义特性保存数据至本地”的完整攻略。 什么是反射和自定义特性 在深入讲解攻略之前,我们先了解一下反射和自定义特性。 反射 反射是.NET框架中一个非常强大的功能,它允许我们在运行时获取元数据,并在运行时动态地创建、操作和销毁对象。通过反射,我们可以在运行时获取并操作类的属性、方法、构造函数等信息。 自定义特性 自…

    C# 2023年6月1日
    00
  • asp.net(c#) MS AJAX的安装

    下面是asp.net(c#)MSAJAX的安装攻略: 1. 安装前的准备 在安装MSAJAX之前,需要确保你已安装Visual Studio和.NET Framework。检查你的系统是否已经安装.NET Framework 2.0和4.0以上的版本,否则需要先安装它们。 2. 下载MSAJAX 可以从Microsoft的官网下载MSAJAX,地址为:htt…

    C# 2023年5月15日
    00
  • C#生成带注释的dll并引用实现

    生成带注释的dll并引用实现的完整攻略如下: 1. 创建Class Library项目 首先,我们需要在Visual Studio中创建一个Class Library项目,命名为”MyLibrary”(或其他你希望名字)。 2. 编写代码并添加注释 编写一个简单的类,并为类、属性和方法添加注释。代码如下: /// <summary> /// My…

    C# 2023年6月7日
    00
  • C# 命名规则(挺不错的)

    C#命名规则攻略 基本概念 在C#中,每个声明的变量、类、方法和其他成员都应该像自然语言一样有一个明确的名称。好的命名可以让你的代码更易读、易懂并且易于维护。下面是C#中的命名规则: 所有的C#关键字必须小写(例如:if、else、for、while等等)。 变量名使用驼峰命名法,即第一个单词的首字母小写,后面每个单词的首字母大写。例如,firstName、…

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