单例模式(Singleton)
单例模式是一种创建型设计模式,它保证一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在需要确保有且仅有一个对象被创建时,使用单例模式就是最佳选择。
实现单例模式的六种方法
1. 饿汉式(饿汉式单例模式是线程安全的,极其简单)
饿汉式单例模式是指,在类加载的时候就创建一个对象实例,并且永久驻留在内存中,以供后续使用。
public sealed class Singleton
{
private static readonly Singleton _instance = new Singleton();
private Singleton() { }
public static Singleton Instance
{
get { return _instance; }
}
}
2. 懒汉式(懒汉式单例模式在多线程环境下存在问题)
懒汉式单例模式是指,在第一次使用时才创建对象实例。如果多个线程同时调用GetInstance()方法,可能会导致创建多个实例的问题,因此需要进行线程同步,保证只创建一个实例。
public sealed class Singleton
{
private static Singleton _instance = null;
private static readonly object padlock = new object();
private Singleton() { }
public static Singleton Instance
{
get
{
if (_instance == null)
{
lock (padlock)
{
if (_instance == null)
{
_instance = new Singleton();
}
}
}
return _instance;
}
}
}
3. Double Check Locking(双重检查锁定)
Double Check Locking模式是一种优化的懒汉式单例模式,确保在多线程环境下只会创建一个对象实例。
public sealed class Singleton
{
private static volatile Singleton _instance;
private static readonly object padlock = new object();
private Singleton() { }
public static Singleton Instance
{
get
{
if (_instance == null)
{
lock (padlock)
{
if (_instance == null)
{
_instance = new Singleton();
}
}
}
return _instance;
}
}
}
4. 静态内部类
静态内部类单例模式是指,在访问静态内部类的静态字段Instance时,会创建唯一的实例。
public sealed class Singleton
{
private Singleton() { }
private static class SingletonHolder
{
internal static readonly Singleton INSTANCE = new Singleton();
}
public static Singleton Instance
{
get { return SingletonHolder.INSTANCE; }
}
}
5. 枚举
枚举单例模式是指,使用枚举类型创建单例对象,枚举类型是在Java 5中引入的。
public enum Singleton
{
INSTANCE;
// method
public void showMessage()
{
Console.WriteLine("Hello World!");
}
}
调用:
Singleton.INSTANCE.showMessage();
6. 单元素的枚举类型
单元素的枚举类型单例模式是指,在枚举中使用一个实例来实现单例。
public sealed class Singleton
{
internal enum SingletonEnum
{
INSTANCE
}
private Singleton() { }
public static Singleton Instance
{
get
{
return SingletonEnum.INSTANCE.GetInstance();
}
}
internal Singleton GetInstance()
{
return SingletonEnum.INSTANCE;
}
}
示例说明
以下是一个示例,展示如何使用饿汉式单例模式实现一个日志系统。用文本文档文件存储日志信息。
public sealed class Logger
{
private static readonly Logger _instance = new Logger();
private Logger() { }
public static Logger Instance
{
get { return _instance; }
}
public void Log(string message)
{
using (StreamWriter writer = new StreamWriter("log.txt", true))
{
writer.WriteLine(DateTime.Now.ToString() + ": " + message);
}
}
public void Clear()
{
File.Delete("log.txt");
}
}
我们可以在整个系统中调用Log()方法,如下所示:
Logger.Instance.Log("Hello World!");
此时,将在项目根目录下创建一个log.txt文件,并向其中写入“Hello World!”和当前时间。
另一个示例:以下是一个示例,展示如何使用枚举单例模式实现一个配置管理器。用键值对存储配置信息。
public enum ConfigurationManager
{
INSTANCE;
private Dictionary<string, string> configData = new Dictionary<string, string>();
public void SetConfigValue(string key, string value)
{
configData[key] = value;
}
public string GetConfigValue(string key)
{
string value;
configData.TryGetValue(key, out value);
return value;
}
}
我们可以使用以下方法将配置值写入配置管理器:
ConfigurationManager.INSTANCE.SetConfigValue("Url", "https://www.example.com");
并使用以下方法获取配置值:
string url = ConfigurationManager.INSTANCE.GetConfigValue("Url");
总结
以上是六种常见的单例模式实现方法。根据实际应用场景的不同,可以选择不同的实现方法。对于绝大多数应用场景来说,饿汉式单例模式是最好的选择,它既简单又高效,并且能够保证线程安全。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#单例模式(Singleton)的6种实现 - Python技术站