单例模式(Singleton)概述
单例模式是设计模式中一种常见的创建型模式,其定义为:保证一个类仅有一个实例,并提供一个访问它的全局访问点。使用单例模式可以确保一个类只被创建一次,并且该类的唯一实例可以被进行全局访问和控制。
在 .Net 中,单例模式可以应用于许多场景,例如控制数据库连接、记录系统日志、全局配置信息等等。下面将介绍如何在 .Net 应用程序中实现单例模式。
实现单例模式
单例模式的实现要点是将类的构造方法私有化,通过静态方法实例化该类,并保证在整个程序生命周期中仅有一个实例对象。
以下是一个 .Net 单例模式的示例代码:
public class Singleton
{
private static Singleton instance;
private static readonly object lockObject = new object();
private Singleton() { }
public static Singleton Instance
{
get
{
// 双重锁定,确保线程安全
if (instance == null)
{
lock (lockObject)
{
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
}
在上述代码中,构造方法被私有化,保证外部无法通过实例化该类来创建新的实例。同时实例变量 instance 被声明为静态变量,静态变量只会在程序运行期间被创建一次。
上述示例代码使用双重锁定,确保线程安全。在单线程模式中,上述代码可以实现单例模式的效果。但是在多线程环境下,多个线程同时调用单例类的 Instance 属性时,可能会导致对象被创建多次的问题。为解决这个问题,可以使用双重检查锁定方式,即先使用 lock 对象进行锁定,然后再进行对象创建或返回。
示例说明
示例 1:控制数据库连接
假设一个项目数据库连接信息存储在一个配置文件中,并且所有的操作都围绕这个连接进行。为了减少资源开销,我们可以将该连接信息存储在单例对象中,并通过一个全局访问点进行调用。(示例代码中省略了数据库连接代码)
public class DbConnection
{
private static DbConnection instance;
private static readonly object lockObject = new object();
public string ConnectionString { get; set; }
private DbConnection() { }
public static DbConnection Instance
{
get
{
// 双重锁定,确保线程安全
if (instance == null)
{
lock (lockObject)
{
if (instance == null)
{
instance = new DbConnection();
}
}
}
return instance;
}
}
}
上述代码中,DbConnection 类只会被创建一次,且该类对象可以在整个程序生命周期中被访问和控制,以确保系统中所有的数据库连接操作都是基于同一个连接。
示例 2:日志记录
很多程序需要记录系统运行状态和错误日志。为了方便接入,常常需要提供一个单例日志记录类,方便所有继承该类的模块进行日志记录。(示例代码中省略了日志记录代码)
public class Logger
{
private static Logger instance;
private static readonly object lockObject = new object();
private Logger() { }
public static Logger Instance
{
get
{
// 双重锁定,确保线程安全
if (instance == null)
{
lock (lockObject)
{
if (instance == null)
{
instance = new Logger();
}
}
}
return instance;
}
}
public void WriteLog(string message)
{
// 省略日志记录代码
}
}
在上述代码中,Logger 类只会被创建一次,且该类对象可以在整个程序生命周期中被访问和控制,以确保系统中所有的日志记录操作都是基于同一个 Logger 对象。
结语
通过单例模式可以将一些全局状态或资源进行统一控制,便于维护和调试。但是需要注意的是,单例模式可能会导致全局状态的长期存在,增加了程序维护的复杂度,也可能会影响到程序的性能。因此,在设计单例模式时需要权衡利弊,谨慎选择合适的实现方式。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:.Net 单例模式(Singleton) - Python技术站