C#设计模式01——单例模式的三种写法
第一种
//在方法里new ,这里使用 双if-lock public class SingleFirst { private static SingleFirst _SingleFirst; private static readonly object _Single_Lock = new object(); private SingleFirst() { } public static SingleFirst GetInstance() { if(_SingleFirst == null) { lock (_Single_Lock) { if(_SingleFirst == null) { _SingleFirst = new SingleFirst(); } } } return _SingleFirst; } }
第二种
/// <summary> /// 在构造函数里new(), 在方法返回 /// </summary> public class SingleSecond { private static SingleSecond _SingleSecond = null; private SingleSecond() { } static SingleSecond() { _SingleSecond = new SingleSecond(); } public static SingleSecond GetInstance() { return _SingleSecond; } }
第三种
/// <summary> /// 在静态字段里new(),方法里返回 /// </summary> public class SingleThrid { private static SingleThrid _SingleThird = new SingleThrid(); private SingleThrid() { } public static SingleThrid GetInstance() { return _SingleThird; } }
运行测试
var a1 = SingleFirst.GetInstance(); var a2 = SingleFirst.GetInstance(); Console.WriteLine($"a1 和 a2 是同一实例:{ object.ReferenceEquals(a1, a2)}"); ; var b1 = SingleSecond.GetInstance(); var b2 = SingleSecond.GetInstance(); Console.WriteLine($"b1 和 b2 是同一实例:{ object.ReferenceEquals(a1, a2)}"); var c1 = SingleThrid.GetInstance(); var c2 = SingleThrid.GetInstance(); Console.WriteLine($"c1 和 c2 是同一实例:{ object.ReferenceEquals(a1, a2)}");
源码下载:https://gitee.com/weilong2020/csharp_23_-design-patterns.git
什么是C#单例模式?
C#单例模式是一种创建对象的设计模式,它保证一个类只有一个实例,而且它很容易被访问。在C#中,可以使用静态变量来实现单例模式,同时使用私有构造函数和公共静态方法来保证单例模式的实现。
为什么要使用C#单例模式?
C#单例模式在许多场合下是非常有用的,它可以确保一个对象实例只被创建一次,并且在整个应用程序中只有一个实例存在,这种方式可以减少资源的浪费,提高系统的性能,同时可以更方便的管理和调用实例。
单例模式应用的场景有哪些?
单例模式可以应用于许多场合,如:
- 常用的应用场景是数据库连接的实例,因为一个系统中只需要一个数据库连接实例即可
- 系统的配置信息类,因为系统的配置信息只有一份,并且需要被全局使用
- 日志记录类,因为日志记录需要记录整个系统的运行情况,它应该被全局共享
- 缓存管理类,因为缓存数据只有一份,需要被全局共享
单例模式有哪些实现方式?
单例模式有多种实现方式,如:
- 饿汉式
- 懒汉式
- 线程安全的懒汉式
- 双重锁定
- 静态初始化
每种实现方式都有其优缺点,可以根据具体的需求来选择合适的实现方式。
如何实现一个C#单例模式?
以下是一个使用静态变量实现的C#单例模式示例:
public class Singleton
{
private static Singleton instance;
private Singleton() { }
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
该示例中,我们使用一个私有的构造函数和一个静态变量来创建一个单例实例,然后使用一个公共的静态方法返回该实例。当第一次访问 `Instance` 属性时,会创建一个新的 `Singleton` 实例,在随后的调用中返回相同的实例。
同时,我们也可以使用线程安全的懒汉式示例:
public class Singleton
{
private static readonly object lockObject = new object();
private static Singleton instance;
private Singleton() { }
public static Singleton Instance
{
get
{
if (instance == null)
{
lock (lockObject)
{
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
}
这种实现方式会把 `Instance` 属性的实现放到一个双重锁定的块中,确保只有在第一次创建实例时才会进入锁定块。这种方式可以更好地保证线程安全。
付费内容,请联系本人QQ:1002453261
本文来自博客园,作者:明志德道,转载请注明原文链接:https://www.cnblogs.com/for-easy-fast/p/14374045.html