单例模式( 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



posted @ 2014-07-08 23:54  欢呼雀跃  阅读(146)  评论(0)    收藏  举报