一个类仅有一个实例,并提供访问实例的全局访问点
单件类:
using System;
namespace Singleton
{
/// <summary>
/// 单例
/// </summary>
class SingletonClass
{
private static SingletonClass instance;
//私有构造函数
private SingletonClass()
{
}
//获取唯一实例(懒汉,延迟初始化,但是多线程可能获取多个实例,不能确保线程安全)
public static SingletonClass Instance()
{
if (instance == null)
{
instance = new SingletonClass();
}
return instance;
}
}
/// <summary>
/// 线程安全单例
/// </summary>
class ThreadSafeSingletonClass
{
private static ThreadSafeSingletonClass instance = new ThreadSafeSingletonClass();
//私有构造函数
private ThreadSafeSingletonClass()
{
}
//获取唯一实例(饿汉,线程安全,但是不能延迟初始化)
public static ThreadSafeSingletonClass Instance()
{
return instance;
}
}
}
调用:
using System;
namespace Singleton
{
class Program
{
static void Main(string[] args)
{
SingletonClass singleton1 = SingletonClass.Instance();
SingletonClass singleton2 = SingletonClass.Instance();
//判断两个对象实例是否相等
if (singleton1 == singleton2)
{
Console.WriteLine("singleton1等于singleton2");
}
ThreadSafeSingletonClass threadSafeSingleton1 = ThreadSafeSingletonClass.Instance();
ThreadSafeSingletonClass threadSafeSingleton2 = ThreadSafeSingletonClass.Instance();
//判断两个对象实例是否相等
if (threadSafeSingleton1 == threadSafeSingleton2)
{
Console.WriteLine("threadSafeSingleton1等于threadSafeSingleton2");
}
Console.Read();
}
}
}
结果:
参考资料:《设计模式-可复用面对对象软件的基础》