对于单例模式的详细讲解可以分成以下几个部分:
什么是单例模式?
单例模式是一种创建型的设计模式,用于保证某一个类仅有一个实例,并提供全局的访问点。
通常情况下,我们可以通过类创建多个对象,但是有时候我们需要只创建一个对象,比如全局的配置、日志等。这时候单例模式就派上用场了。
如何实现单例模式?
实现单例模式有多种方式,以下是其中比较常用的几种:
饿汉式单例模式
饿汉式单例模式指在类加载的时候就创建了一个对象,以后每次调用获取对象的方法,都返回同一个对象。
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技术站