第一种
代码语言:javascript复制 //在方法里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;
}
}
第二种
代码语言:javascript复制 /// <summary>
/// 在构造函数里new(), 在方法返回
/// </summary>
public class SingleSecond
{
private static SingleSecond _SingleSecond = null;
private SingleSecond() { }
static SingleSecond()
{
_SingleSecond = new SingleSecond();
}
public static SingleSecond GetInstance()
{
return _SingleSecond;
}
}
第三种
代码语言:javascript复制 /// <summary>
/// 在静态字段里new(),方法里返回
/// </summary>
public class SingleThrid
{
private static SingleThrid _SingleThird = new SingleThrid();
private SingleThrid() { }
public static SingleThrid GetInstance()
{
return _SingleThird;
}
}
运行测试
代码语言:javascript复制 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#单例模式示例:
代码语言:javascript复制public class Singleton
{
private static Singleton instance;
private Singleton() { }
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
该示例中,我们使用一个私有的构造函数和一个静态变量来创建一个单例实例,然后使用一个公共的静态方法返回该实例。当第一次访问 `Instance` 属性时,会创建一个新的 `Singleton` 实例,在随后的调用中返回相同的实例。
同时,我们也可以使用线程安全的懒汉式示例:
代码语言:javascript复制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` 属性的实现放到一个双重锁定的块中,确保只有在第一次创建实例时才会进入锁定块。这种方式可以更好地保证线程安全。