单例设计模式Singleton 和多例模式

来源:互联网 发布:phoneshop软件 编辑:程序博客网 时间:2024/05/19 05:05

单列设计模式的特点:

 

单例类只能有一个实例。

单例类必须自己创建自己的唯一实例。

单例类必须给所有其他对象提供这一实例。

一个典型的单例类的实现如下所示:其中构造子私有表示子类不能被继承。

 

单列设计模式的示例代码:

public class Singleton

{

private static Singleton m_instance = null;



private Singleton()

{

}

public static Singleton getInstance()

{

if(m_instance==null)

{

m_instance=new Singleton();

}

return m_instance;

}

}

 

 

多列设计模式:

 

所谓多例模式,实际上就是单例模式的自然推广,单例类一般情况下只可以有一个实例,但单例类也可以推广到允许有限个实例,这种模式就是多例模式。作为对象的创建模式,多例模式有以下特点:

 

 

 

 

 

多例类可以有多个实例

多例类必须自己创建、管理自己的实例,并向外界提供自己的实例。

多例类分为有上限多例类与无上限多例类。

一个有上限的多例类已经把实例的上限当作逻辑的一部分,并建造到了多例类的内部。如下

 

多列设计模式类图;

 

 

 

 

多列设计模式的实例:

 

public class Multiton

{

private static Multiton instance1=null;

private static Multiton instance2=null;

 

private Multiton()

{

}

 

public static Multiton getInstance(int whichOne)

{

if(whichOne==1)

{

if(instance1==null)

{

instance1=new Multiton ();

}

return instance1;

}

else

{

if(instance2==null)

{

instance2=new Multiton ();

}

return instance2;

 

}

}

}

 

 

(2)多线程Singleton实现:

 1    class MultiThread_Singleton
 2     {
 3       private  static volatile MultiThread_Singleton instance = null;
 4       private static object lockHelper = new object();
 5       private MultiThread_Singleton() { }
 6       public static MultiThread_Singleton Instance
 7       {
 8           get
 9           {
10               if (instance == null)
11               {
12                   lock (lockHelper)
13                   {
14                       if (instance == null)
15                       {
16                           instance = new MultiThread_Singleton();
17                       }
18                   }
19               }
20               return instance;
21           }         
22       }
23    

此程序对多线程是安全的,使用了一个辅助对象lockHelper,保证只有一个线程创建实例(如果instance为空,保证只有一个线程instance = new MultiThread_Singleton();创建唯一的一个实例)。(Double Check)
请注意一个关键字volatile,如果去掉这个关键字,还是有可能发生线程不是安全的。
volatile 保证严格意义的多线程编译器在代码编译时对指令不进行微调。

 

(3)静态Singleton实现


3         class Static_Singleton
4         {
5             public static readonly Static_Singleton instance = new Static_Singleton();
6             private Static_Singleton() { }
7         }


以上代码展开等同于
1     class Static_Singleton
2         {
3             public static readonly Static_Singleton instance;
4             static Static_Singleton()
5             {
6                 instance = new Static_Singleton();
7             }
8             private Static_Singleton() { }
9         }

 

原创粉丝点击