.Net设计模式之单例模式(Singleton)
什么是单例模式?
在软件系统中,有些类只需要存在唯一的一个实例对象,比如系统中的窗口管理器、文件系统、计时器等,这些对象在系统中只允许存在一个实例。单例模式就是为了满足这类需求而生的一种设计模式。
单例模式是指在整个应用程序中只能有一个实例对象的类。通常情况下,单例模式是指全局社区共享的一个唯一对象实例,比如一个窗口管理器。
单例模式的应用场景
- 一些类的对象只需要存在一个。 比如系统中唯一的日志记录器、数据库连接池等对象。
- 计数器或计时器的应用。 比如系统中可以有多个计数器或计时器,但是它们的值需要被整个系统共享。
- 创建对象时资源消耗过大,或者对象的生命周期过长。 比如系统中存在一个对象的创建需要大量的计算资源,或者该对象的生命周期很长,如果反复创建、销毁会导致系统资源浪费等问题。
实现单例模式的方法
饿汉式
饿汉式在类被加载的时候就创建了实例对象,并且对象在整个应用程序中都可以被访问。这种方法非常直观简单,但是存在性能问题,因为如果应用程序中没有用到该对象,那创建对象的操作就变成了一次无效的操作,浪费了系统资源。
public class Singleton {
// 在类加载的时候就创建了对象
private static Singleton instance = new Singleton();
// 私有构造函数,避免外部对类进行实例化
private Singleton() {}
// 返回单例对象实例
public static Singleton GetInstance() {
return instance;
}
}
懒汉式
懒汉式是指在第一次使用对象时才创建该对象的实例,并且只创建一个。这种方法可以避免浪费系统资源的问题,但是可能出现多线程访问时多次创建实例对象的问题,需要采取措施来保证线程安全。
public class Singleton {
// 私有静态变量,保存单例对象实例
private static Singleton instance = null;
// 私有构造函数,避免外部对类进行实例化
private Singleton() {}
// 返回单例对象实例
public static Singleton GetInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
双重检查锁定
此处所谓双重检查锁定就是指在多线程访问时,通过加锁的方式解决多次创建实例对象的问题。通过使用这种方法可以避免性能问题,并且保证线程安全。
public class Singleton {
// 私有静态变量,保存单例对象实例
private static Singleton instance = null;
// 定义一个线程锁
private static readonly object lockObject = new object();
// 私有构造函数,避免外部对类进行实例化
private Singleton() {}
// 返回单例对象实例
public static Singleton GetInstance() {
// 第一重检查,判断对象是否已经存在了
if(instance == null) {
// 加锁,避免多个线程同时调用CreateInstance方法创建实例对象
lock(lockObject) {
// 第二重检查,判断对象是否已经存在了
if(instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
示例说明
示例1:创建单例的计数器
在此示例中,我们创建了一个计数器类,它可以实现对应用程序中所有计数器对象进行计数,同时确保整个应用程序中只有一个计数器对象实例。
public class Counter {
private static readonly object lockObject = new object();
private static Counter instance = null;
public int Count { get; private set; }
private Counter() {}
public static Counter GetInstance() {
if(instance == null) {
lock(lockObject) {
if(instance == null) {
instance = new Counter();
}
}
}
return instance;
}
public void Add() {
Count++;
}
public void Reset() {
Count = 0;
}
}
示例2:创建单例的配置管理器
在此示例中,我们创建了一个配置管理器类,它可以实现对应用程序中所有配置信息进行管理,同时确保整个应用程序中只有一个配置管理器对象实例。
public class ConfigManager {
private static readonly object lockObject = new object();
private static ConfigManager instance = null;
private Dictionary<string, string> configDict = new Dictionary<string, string>();
private ConfigManager() {}
public static ConfigManager GetInstance() {
if(instance == null) {
lock(lockObject) {
if(instance == null) {
instance = new ConfigManager();
}
}
}
return instance;
}
public void AddConfig(string key, string value) {
if(!configDict.ContainsKey(key)) {
configDict.Add(key, value);
}
}
public string GetConfig(string key) {
if(configDict.ContainsKey(key)) {
return configDict[key];
}
return null;
}
public void RemoveConfig(string key) {
if(configDict.ContainsKey(key)) {
configDict.Remove(key);
}
}
}
以上就是单例模式的设计和实现方法及示例说明。需要注意的是,单例模式不适用于存在多个实例对象的场景,否则会导致应用程序出现严重的设计问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:.Net设计模式之单例模式(Singleton) - Python技术站