当在 C# 中开发应用程序时,善于使用设计模式是非常重要的。单例模式是一种常用的模式,它用于确保一个类只有一个实例,并提供全局访问点。
以下是实现单例模式的典型步骤:
步骤一:声明一个私有的构造函数
单例模式的首要目标是保证一个类只创建一个对象,并允许客户端代码访问实例。为了控制类的实例化,需要阻止类外部的代码调用构造函数。可以通过将构造函数的访问权限设置为私有来实现这一目标。这样,只有在类中的静态方法才能访问构造函数:
public class Singleton
{
private static Singleton instance;
private Singleton() {}
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
在这个示例中,构造函数被设置为私有。Singleton 类被定义为 public,所以其他类可以引用它。它包含一个私有静态成员变量 instance,该变量在第一次调用 Instance 属性时初始化,并返回该对象。
步骤二:创建一个静态的公共方法
通过定义一个静态的公共方法来允许客户端代码获取单例。该方法检查是否已经创建了一个实例,如果没有,则创建一个新的实例,并返回该对象:
public class Singleton
{
private static Singleton instance;
private Singleton() {}
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
使用这个方法时,客户端代码可以先调用 Instance 属性,然后使用它返回的对象来调用方法:
Singleton.Instance.Method();
示例1:线程安全的单例模式
在多线程应用程序中使用单例模式需要特别注意。如果多个线程同时访问一个未初始化的单例实例,则可能会发生 race condition。为了解决这个问题,可以使用锁定机制,但这会影响应用程序的性能。一种更好的解决方案是使用第一次调用属性时初始化单例实例的线程安全代码:
public sealed class Singleton
{
private static readonly Singleton instance = new Singleton();
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Singleton() { }
private Singleton() { }
public static Singleton Instance
{
get
{
return instance;
}
}
}
这种方式解决了线程安全问题,因为 CLR 保证对静态初始化方法的并发访问保证了在.NET Framework的所有版本中的线程安全。
示例2:Lazy 单例模式
在某些情况下,单例模式的实例化可以非常耗时,因为它需要执行一个复杂的初始化过程。在这种情况下,实例化过程应该在需要时才发生,而不是在程序启动时。Lazy
public sealed class Singleton
{
private static readonly Lazy<Singleton> lazy = new Lazy<Singleton>(() => new Singleton());
private Singleton() { }
public static Singleton Instance
{
get
{
return lazy.Value;
}
}
}
在这个示例中,Singleton 类使用了 Lazy
需要使用时,使用 Singleton.Instance 调用 Singleton 类的属性,Lazy
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c# 单例模式的实现 - Python技术站