什么叫做单例模式?
单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。
为什么要使用单例模式?
对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。如在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。
单例模式的特点:
1.单例模式使得类在程序生命周期的任何时刻都只有一个实例
2.单例的构造函数是私有的,外部程序如果想要访问这个单例类的话,必须通过getInstance()来请求得到这个 单例类的实例。
namespace Singleton
{
public class Singleton
{
//定义一个私有的静态全局变量来保存该类的唯一实例
private static Singleton singleton;
/// 构造函数必须是私有的
/// 这样在外部便无法使用 new 来创建该类的实例
private Singleton()
{
}
/// 定义一个全局访问点
/// 设置为静态方法
/// 则在类的外部便无需实例化就可以调用该方法
public static Singleton GetInstance()
{
//这里可以保证只实例化一次
//即在第一次调用时实例化
//以后调用便不会再实例化
if (singleton == null)
{
singleton = new Singleton();
}
return singleton;
}
}
}
Singleton 类会在在第一次调用 GetInstance()时创建一个实例,并将这个实例的引用封装在自身类中,
然后以后调用 GetInstance()时就会判断这个 Singleton 是否存在一个实例了,如果存在,则不会再创建实例。而是调用以前生成的类的实例,这样下来,整个应用程序中便就只存在一个实例了。
单例模式在多线程中的应用:
namespace Singleton
{
public class Singleton
{
//定义一个私有的静态全局变量来保存该类的唯一实例
private static Singleton singleton;
//定义一个只读静态对象
//且这个对象是在程序运行时创建的
private static readonly object syncObject = new object();
/// 构造函数必须是私有的
/// 这样在外部便无法使用 new 来创建该类的实例
private Singleton()
{
}
/// 定义一个全局访问点
/// 设置为静态方法
/// 则在类的外部便无需实例化就可以调用该方法
public static Singleton GetInstance()
{
//这里可以保证只实例化一次
//即在第一次调用时实例化
//以后调用便不会再实例化
//第一重 singleton == null
if (singleton == null)
{
lock (syncObject)
{
//第二重 singleton == null
if (singleton == null)
{
singleton = new Singleton();
}
}
}
return singleton;
}
}
}
饿汉式:(管你要不要,先生成了再说,你要就return给你)
namespace Singleton
{
public sealed class Singleton
{
private static readonly Singleton singleton = new Singleton();
private Singleton()
{
}
public static Singleton GetInstance()
{
return singleton;
}
}
}
懒汉式:(你要才生成对象给你)
public static Singleton GetInstance()
{
if (singleton == null)
{
lock (syncObject)
{
if (singleton == null)
{
singleton = new Singleton();
}
}
}
return singleton;
}