设计模式01: Singleton 单例模式(创建型模式)

Singleton 单例模式(创建型模式)

动机(Motivation)
当进行软件开发是会有这样一种需求:在系统中只有存在一个实例才能确保它们的逻辑正确性、以及良好的效率。
这应该是类设计者的责任,而不是使用者的责任。

意图(Intent)
保证一个类仅有一个实例,并提供一个该实例的全局访问点。——《设计模式》GoF

单线程Singleton模型实现:

 1 pulic class Singleton
 2 {
 3     private static Singleton instance;//如果客户不需要这个实例最好不要new一个实例,不要在这里new
 4     
 5     private Singleton(){}//如果不写的话,将会是public的构造器,public是可以随便new的
 6     
 7     public static Singleton Instance
 8     {
 9         get
10         {
11             if(instance==null)
12             {
13                 instance=new Singleton();
14             }
15             return instance;
16         }
17     }
18 }

调用:Singleton instance = Singleton.Instance;

单线程Singleton模式的几个要点:
Singleton模式总的实例构造器可以设置为protected以允许子类派生。
Single模式一般不要支持IColoneable接口,因为这可能导致多个对象实例,同样与Singleton模式的初衷违背。
Single模式只考虑到了对象创建的管理,没有考虑对象销毁的管理。就支持垃圾回收的平台和对象的开销来讲,我们没有必要对其销毁进行特殊的处理。

多线程Singleton模型实现:

 1 class Singleton
 2 {
 3     private static volatile Singleton instance=null;//编译代码的时候编译器会对代码微调,为了禁止微调所以要加volatile
 4     private static object lockHelper=new object();
 5     private Singleton(){}
 6     public sttic Singleton Instance
 7     {
 8         get
 9         {
10             if(instance==null)
11             {
12                 lock(lockHelper)
13                 {
14                     if(instance==null)
15                     {
16                         instance=new Singleton();
17                     }
18                 }
19             }
20             return instance;
21         }
22     }
23 }

.NET自带的单例实现:

1 class Singleton
2 {
3     public static readonly Singleton Instance = new Singleton();//内联初始化
4     private Singleton(){}
5 }

等同于:

1 class Singleton
2 {
3     public static readonly Singleton Instance;//Instance在被访问之前会先走静态构造器
4     static Singleton()//静态构造器,.net类型初始化机制可以保证只有一个线程执行。静态构造器不能传递参数,它是给系统来调用的。
5     {
6         Instance=new Singleton();
7     }
8     private Singleton(){}
9 }

弊端:
不支持参数化
以单线程Singleton模型实现为例,就可以支撑参数化:

 1 pulic class Singleton
 2 {
 3     private static Singleton instance;
 4     
 5     private Singleton(int x,int y)
 6     {
 7         this.x=x;
 8         this.y=y;
 9     }
10     
11     public static Singleton GetInstance(int x,int y)
12     {
13         if(instance==null)
14         {
15             instance=new Singleton(x,y);
16         }
17         else
18         {
19             instance.x=x;
20             instance.y=y;
21         }
22         return instance;
23     }
24     
25     int x;
26     int y;   
27 }

调用:
Singleton t1=Singleton.GetInstance(100,200);
Singleton t2=Singleton.GetInstance(200,300);

其实可以用设置属性的方法也可以这实现:

 1 class Singleton
 2 {
 3     public static readonly Singleton Instance = new Singleton();//内联初始化
 4     private Singleton(){}
 5     
 6     public int x
 7     {
 8         get{
 9             return this.x;
10         }
11         set{
12             this.x=x;
13         }
14     }
15     public int y
16     {
17         get{
18             return this.y;
19         }
20         set{
21             this.y=y;
22         }
23     }
24     int x;
25     int y;
26     
27     /*也可以添加初始化函数(也可以带参数),来和构造器进行剥离
28     public void Init()
29     {
30         ...
31     }
32     */
33 }

Singleton模式扩展
将一个实例扩展到n个实例,例如对象池的实现。
将new构造器的调用转移到其他类中,例如多个类协同工作环境中,某个局部环境只需要拥有某个类的一个实例。
理解和扩展Singleton模式的核心是“如何控制用户使用new对一个类的实例构造器的任意调用”。

最近在看李建忠老师的 《C#面向对象设计模式纵横谈》,虽然是很多年前的视频,还是很受启发,就决定把笔记整理一遍。

原文地址:https://www.cnblogs.com/jesselzj/p/4700806.html