设计模式 -- 单例模式(Singleton Pattern)
实现单例模式需要做到以下几点:
1,定义一个私有静态变量,用以保存单例类的实例.
2,构造函数私有化,用以防止被使用者实例化.
3,为使用者提供一个全局公共访问点来使用单例类.
下面实现一个单例类:

双重锁方式创建实例
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace CommonLib
7 {
8 public class ClassA
9 {
10 private static ClassA _Instance ; //私有静态变量,用以保存类的实例
11 private static object objhelper = new object(); //辅助对象
12 private string _CreateTime; //实例的创建时间,测试用.
13
14 //注意,实现单例时构造函数须是私有的,防止类外被实例化
15 private ClassA()
16 {
17 _CreateTime = DateTime.Now.ToString("yyMMddhhmmssfff");
18 }
19
20 // 为使用类提供一个全局的访问点以使用单例类.
21 public static ClassA Instance
22 {
23 //get属性器内以一个双重锁来防止多线程时创建多个实例
24 get
25 {
26 if (_Instance == null)
27 {
28 lock (objhelper)
29 {
30 if (_Instance == null)
31 {
32 _Instance = new ClassA();
33 }
34 }
35 }
36 return _Instance;
37 }
38 }
39
40 public string GetTime()
41 {
42 return _CreateTime;
43 }
44 }
45 }
46
以下为使用单例类:

使用单例类
1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using System.Text;
5
6
using System.Threading;
7
using CommonLib;
8
9
namespace ConsoleApp
10

{
11
class Program
12
{
13
static void Main(string[] args)
14
{
15
16
ClassA instace = ClassA.Instance;
17
Console.WriteLine("实例 instace 创建时间 : " + instace.GetTime());
18
19
Console.WriteLine("再来一次看看..");
20
Console.ReadLine();
21
22
ClassA instace1 = ClassA.Instance;
23
Console.WriteLine("实例 instace1 创建时间 : " + instace1.GetTime());
24
25
Console.ReadLine();
26
27
}
28
}
29
}
30
输出内容为:
实例 instace 创建时间 : 081030090139879
再来一次看看..
实例 instace1 创建时间 : 081030090139879
刚才又看了下Terrylee的博文后,自己写的这个单例类的创建有点问题.
上面用双重锁的方式来创建单例类的实例时,每次都需要检查实例是否存在,增加了系统开销,下面再以Terrylee所用的静态初始化的方式来改善下这个单例类..

以静态初始化方式创建单例类的实例
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace CommonLib
7 {
8 public class ClassA
9 {
10 private static ClassA _Instance = new ClassA(); //静态初始化创建实例
11 private string _CreateTime; //实例的创建时间,测试用.
12
13 //注意,实现单例时构造函数必须是私有的,防止类外被实例化
14 private ClassA()
15 {
16 _CreateTime = DateTime.Now.ToString("yyMMddhhmmssfff");
17 }
18
19 // 为使用类提供一个全局的访问点以使用单例类.
20 public static ClassA Instance
21 {
22 get
23 {
24 return _Instance; //直接返回实例
25 }
26 }
27
28 public string GetTime()
29 {
30 return _CreateTime;
31 }
32 }
33 }
34
运行结果显示两次创建实例的时间是一致的,说明只创建了一个实例.
参考文章:
Terrylee: .NET设计模式(2):单件模式(Singleton Pattern)