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

yizhihongxing

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

什么是单例模式?

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

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

如何实现单例模式?

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

饿汉式单例模式

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

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#中Linq to Sql 增删除的实例

    对于“c#中Linq to Sql 增删改查的实例”,我可以提供以下攻略: 1. Linq to Sql 概述 LINQ to SQL是用于访问关系数据库的组件,提供了基于LINQ语法的查询、插入、更新和删除操作,使得访问数据库时,可以像访问集合一样使用LINQ语句,从而更加方便和简洁。 Linq to Sql与数据库之间的映射通过数据上下文类实现,其提供了…

    C# 2023年5月31日
    00
  • C#打开扬声器的实操方法和代码

    C#打开扬声器的实操方法和代码 在C#语言中,我们可以通过使用System.Media命名空间中的SoundPlayer类来播放音频文件。以下是打开扬声器的实操方法和代码。 例1:使用SoundPlayer播放本地音频文件 首先需要在你的项目中引入System.Media命名空间。 using System.Media; 接着,创建一个新的实例SoundPl…

    C# 2023年6月7日
    00
  • 解读ASP.NET 5 & MVC6系列教程(13):TagHelper

    解读ASP.NET 5 & MVC6系列教程(13):TagHelper 在 ASP.NET 5 & MVC6 中,TagHelper 是一种新的技术,它可以帮助我们更方便地生成 HTML 标记。本攻略将介绍如何使用 TagHelper。 步骤 步骤1:创建一个新的 ASP.NET 5 & MVC6 项目 首先,我们需要创建一个新的 …

    C# 2023年5月17日
    00
  • 详解在ASP.NET Core中如何编写合格的中间件

    详解在ASP.NET Core中如何编写合格的中间件 在ASP.NET Core中,中间件是一种用于处理HTTP请求和响应的组件。中间件可以执行各种任务,例如记录请求、验证身份、缓存响应等。在本攻略中,我们将详细讲解如何编写合格的中间件,并提供两个示例说明。 步骤一:创建中间件 在ASP.NET Core中创建中间件,您需要创建一个类,并实现IMiddlew…

    C# 2023年5月17日
    00
  • C#泛型的逆变协变之个人理解

    下面是关于C#泛型的逆变协变的个人理解和相关示例: 什么是泛型逆变和协变? 在C#中,泛型指的是具有参数化类型的类和方法。逆变和协变是泛型中的一种特殊的概念,它们分别指泛型类型参数的赋值方式和约束条件。 泛型逆变(contravariance)指的是泛型类、泛型委托等类型参数的类型参数能够赋值给其父类型参数,或者其父类型参数的类型参数(即父类型的类型参数)能…

    C# 2023年5月14日
    00
  • C# 未将对象引用设置到对象的实例

    问题描述当我们在C#代码中遇到一个Null引用时,会提示“未将对象引用设置到对象的实例”错误。这个错误提示常常是因为我们的代码尝试操作一个不存在的对象实例引起的,那么该如何解决呢? 处理过程1. 检查代码 解决这个错误的第一步是检查代码,找出引起这个错误的具体语句。我们需要确定代码中哪一个对象为空,然后比对代码逻辑,查看是否出现了对象为NULL时的情况。比如…

    C# 2023年5月15日
    00
  • 详解c# .net core 下的网络请求

    详解C#.NET Core下的网络请求 在C#.NET Core下,我们可以使用多种方法进行网络请求,例如HttpClient、HttpWebRequest等等,下面将分别进行介绍。 HttpClient网络请求 创建HttpClient对象 使用HttpClient进行网络请求首先需要创建HttpClient对象。可以在以下几种方式中选取其中一种进行创建。…

    C# 2023年5月15日
    00
  • C# 委托的三种调用示例(同步调用 异步调用 异步回调)

    C# 委托是一种特殊的数据类型,它允许在运行时将方法作为参数传递给其他方法,也可以作为返回值,这在异步编程中很有用。本篇攻略将重点讲解 C# 委托的三种调用示例:同步调用、异步调用和异步回调。 同步调用 同步调用是指调用一个方法时,程序会一直等待该方法执行完毕并返回结果后再继续执行下一步操作。这种调用方式是最常见的,也是最简单的方式。 以下代码示例展示了委托…

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