您的位置:首页 > 其它

设计模式总结—单例模式

2013-04-11 10:05 190 查看
单例模式定义是保证一个类仅有一个实例,并提供一个访问它的全局访问点。
简单的来说单例模式包括3点内容:
1.该类只有一个实例
2.在该类内部创建自身的实例对象
3.向整体系统公开这个实例接口(全局访问点)

单例模式分为懒汉式单例类和饿汉式单例类。

首先我们来看下懒汉式单例类,它是说对象要在第一次被引用时,才会将自己实例化,懒汉式单例类又分为单线程和多线程两种,我们就依次来看下。第一个是单线程时的懒汉式单例类的代码。


classSingleton

{

privatestatic Singleton instance;



//利用private保证了外界无法用new创建此类实例

privateSingleton()

{ }



//获取本类实例的唯一全局访问点

publicstatic Singleton GetInstance()

{

//若实例不存在,则new一个新实例,否则返回已有实例

if(instance == null)

{

instance = new Singleton();

}

return instance;

}

}

接下来我们来看下多线程时的单例代码,

class Singleton

{

privatestatic Singleton instance;



//程序运行时创建一个静态只读的进程辅助对象

privatestatic readonly object syncRoot = new object();

privateSingleton()

{ }



publicstatic Singleton GetInstance()

{

if(instance == null)//先判断实例是否存在,不存在再加锁处理

{

lock (syncRoot)

{

if (instance == null)

{

instance = new Singleton();

}

}

}

return instance;

}



}


而饿汉式单例类是通过静态初始化的方式在自己被加载时就将自己实例化。下面我们也来看下它的代码:

public sealed class Singleton

{

//在第一次引用类的任何成员时创建实例,公共语言运行库复杂处理变量初始化。

privatestatic readonly Singleton instance = new Singleton();



privateSingleton() { }

publicstatic Singleton GetInstance()

{

return instance;

}



}

对于懒汉式和饿汉式各有不同,由于懒汉式,即静态初始化的方法,它是类一加载就实例化的对象,所以要提前占用系统资源,然后懒汉式又会面临多线程访问的安全性问题,需要双重锁定这样的处理才可以保证安全,所以到底使用哪一种方式,取决于实际的需求。

最后我们在来看下单例模式的类图:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: