单例模式( Singleton)
定义:保证一个类仅有一个实例,并且提供一个访问它的全局访问点。
类图:

单例模式根据实例化对象时机的不同分为两种:一种是饿汉式单例,一种是懒汉式单例。饿汉式单例在单例类被加载时候,就实例化一个对象交给自己的引用;而懒汉式在调用取得实例方法的时候才会实例化对象。代码如下
饿汉式单例
public class Singleton { private static Singleton singleton = new Singleton(); private Singleton() { } public static Singleton getInstance() { return singleton; } }
懒汉式单例
public class Singleton { private static Singleton singleton; private Singleton(){} public static Singleton getInstance(){ //5行 if(singleton==null){ singleton = new Singleton(); } return singleton; } }
这种方式,对于多线程来说,还可以能存在多个实例,假如有两个线程,A线程执行到5行 singleton 还没new,B线程也执行到5行,现在singleton =null,那就new两个
singleton 。
可以试一下这个方法:
public class Singleton { public static readonly Singleton singleton = new Singleton(); private Singleton() { } }
我们看下反编译之后的代码
public class Singleton { // Fields public static readonly Singleton singleton; // Methods static Singleton() { singleton = new Singleton(); } private Singleton(); } Expand Methods
因为这个构造函数是属于类的,而不属于任何一个实例,所以这个构造函数只会被执行一次,而且是在创建此类的第一个实例或引用任何静态成员之前,由.NET自动调用。
还有个方法
public sealed class Singleton 2{ 3 static Singleton instance=null; 4 static readonly object padlock = new object(); 5 6 Singleton() 7 { 8 } 9 10 public static Singleton Instance 11 { 12 get 13 { 14 lock (padlock) 15 { 16 if (instance==null) 17 { 18 instance = new Singleton(); 19 } 20 return instance; 21 } 22 } 23 } 24}
lock (padlock)加锁了,只有当地一个线程进入,并且释放锁,第二个线程才可以进入。
实现要点:
1. Singleton模式是限制而不是改进类的创建。
2. Singleton类中的实例构造器可以设置为protected以允许子类派生。
3. Singleton模式一般不支持Icloneable接口,因为这可能导致多个对象实例, 与Singleton模式的初衷违背。
4. Singleton模式一般不要支持序列化,这也有可能导致多个对象实例,这 也与Singleton模式的初衷违背。
5. Singleton模式只考虑对象创建的管理,没有考虑到销毁的管理,就支持 垃圾回收的平台和对象的开销来讲,我们一般没必要对其销毁进行特殊的管理。
6. 理解和扩展Singleton核心是“如何控制用户使用new对一个类的构造器 的任意调用”.
7. 可以简单的修改一下Singleton,使它有少数几个实例,这样做是允许的 而且是有意义的。
单例实例:请看:http://www.dofactory.com/Patterns/PatternSingleton.aspx#_self1

浙公网安备 33010602011771号