Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点。
有很多种实现方式 这种最好理解
Code
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 if (instance==null)
15 {
16 lock (padlock)
17 {
18 if (instance==null)
19 {
20 instance = new Singleton();
21 }
22 }
23 }
24 return instance;
25 }
26 }
27}
28
这种实现方式对多线程来说是安全的,同时线程不是每次都加锁,只有判断对象实例没有被创建时它才加锁,有了我们上面第一部分的里面的分析,我们知道,加锁后还得再进行对象是否已被创建的判断。它解决了线程并发问题,同时避免在每个 Instance 属性方法的调用中都出现独占锁定。它还允许您将实例化延迟到第一次访问对象时发生。实际上,应用程序很少需要这种类型的实现。大多数情况下我们会用静态初始化。这种方式仍然有很多缺点:无法实现延迟初始化。
可能的开发混淆:使用 singleton 对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用 new 关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。
应用场景
l 每台计算机可以有若干个打印机,但只能有一个Printer Spooler,避免两个打印作业同时输出到打印机。
(摘自吕震宇的C#设计模式(7)-Singleton Pattern)
l PC机中可能有几个串口,但只能有一个COM1口的实例。
l 系统中只能有一个窗口管理器。
l .NET Remoting中服务器激活对象中的Sigleton对象,确保所有的客户程序的请求都只有一个实例来处理。
自己搞个例子
Code
public sealed class Singleton
{
private static readonly object key = new object();
static Singleton sing;
public int count = 0;
public Singleton()
{ }
public static Singleton CreateInstance()
{
if (sing == null)
{
lock (key)
{
if (sing == null)
{
sing = new Singleton();
}
}
}
return sing;
}
}
Code
Singleton sing = Singleton.CreateInstance();
sing.count = 4;
Singleton sing1 = Singleton.CreateInstance();
sing1.count = 7;
Singleton sing2 = Singleton.CreateInstance();
sing2.count = 8;
Singleton sing3 = Singleton.CreateInstance();
sing3.count = 9;
不管NEW 多少次 只有一个实例 count=9