标签:构造 序列化 窗口管理 它的 设计模式 compile ref str 原则
单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。
单例模式有三个要点:
一些资源管理器常常设计成单例模式。
C#中的单例模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点
实现要点:
优点:
缺点:
实用性:
当类只有一个实例而且客户可以从一个总所周知的访问点访问它时。
当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
应用场景:
单例模式的几种经典实现方式:
{
static Singleton instance=null;
Singleton()
{
}
public static Singleton Instance
{
get
{
if (instance==null)
{
instance = new Singleton();
}
return instance;
}
}
}
这是最简单的实现方式 ,但该实现对线程来说是不安全的,当有两个或多个线程同时判断instance==null并且得到结果都为true,就会创建多个实例,这就违背了单例模式的原则。实际上在上述代码中,有可能在计算出表达式的值之前,对象实例已经被创建,但是内存模型并不能保证对象实例在第二个线程创建之前被发现。
该实现方式直到要求产生一个实例才执行实例化,这种方法称为“惰性实例化”,惰性实例化避免了在应用程序启动时实例化不必要的singleton.
2.
public sealed class Singleton
{
static Singleton instance=null;
static readonly object padlock = new object();
Singleton()
{
}
public static Singleton Instance
{
get
{
lock (padlock)
{
if (instance==null)
{
instance = new Singleton();
}
return instance;
}
}
}
}
这种实现方式对线程来说是安全的,但是这种实现方式增加了额外的开销,损失了性能。
3.
public sealed class Singleton
{
static Singleton instance=null;
static readonly object padlock = new object();
Singleton()
{
}
public static Singleton Instance
{
get
{
if (instance==null)
{
lock (padlock)
{
if (instance==null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
}
这种实现方式对线程来说是安全的,同时线程不是每次都加锁,只有判断对象实例没有创建时它才加锁。解决了线程并发的问题,但是无法实现延迟初始化。
4.
public sealed class Singleton
{
static readonly Singleton instance=new Singleton();
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Singleton()
{
}
Singleton()
{
}
public static Singleton Instance
{
get
{
return instance;
}
}
}
该实现方式在第一次引用类的成员时创建实例。公共语言运行库负责处理变量初始化。该方法的缺点是:对实例化机制的控制权较少。在大多数情况下,静态初始化是在.NET中实现Singleton的首选方法。
5. public sealed class Singleton
{
Singleton()
{
}
public static Singleton Instance
{
get
{
return Nested.instance;
}
}
class Nested
{
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Nested()
{
}
internal static readonly Singleton instance = new Singleton();
}
}
该实现方式的初始化工作由Nested类的一个静态成员来完成,这样就实现了延迟初始化。是值得推荐的一种实现方式。
设计模式之五:单例模式(Singleton Pattern)
标签:构造 序列化 窗口管理 它的 设计模式 compile ref str 原则
原文地址:http://www.cnblogs.com/mamxfx/p/7148101.html