Singleton设计模式的C#实现
来源:互联网 发布:mac唇釉如何辨别真假 编辑:程序博客网 时间:2024/04/29 23:53
Singleton(译为单件或单态)模式是设计模式中比较简单而常用的模式。本质上说,Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点。
Singleton的实现方式
方法一:简单实现,这种方式的实现对于线程来说并不是安全的,因为在多线程的环境下有可能得到Singleton类的多个实例。两个优点:1.由于实例是在 Instance属性方法内部创建的,因此类可以使用附加功能(例如,对子类进行实例化),即使它可能引入不想要的依赖性。2.直到对象要求产生一个实例才执行实例化;这种方法称为“惰性实例化”。惰性实例化避免了在应用程序启动时实例化不必要的singleton。
using System;
namespace csPattern.Singleton
{
public sealed class Singleton
{
static Singleton instance = null;
Singleton()
{
}
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
}
方法二:实现对于线程来说是安全的。但是这种实现方式增加了额外的开销,损失了性能。
using System;
namespace csPattern.Singleton
{
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;
}
}
}
}
}
方法三:对多线程来说是安全的,同时线程不是每次都加锁,只有判断对象实例没有被创建时它才加锁,它解决了线程并发问题,同时避免在每个Instance属性方法的调用中都出现独占锁定。它还允许您将实例化延迟到第一次访问对象时发生。同时避免在每个Instance属性方法的调用中都出现独占锁定。它还允许您将实例化延迟到第一次访问对象时发生。实际上,应用程序很少需要这种类型的实现。大多数情况下我们会用静态初始化。这种方式仍然有很多缺点:无法实现延迟初始化。
using System;
namespace csPattern.Singleton
{
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;
}
}
}
}
方法四:静态初始化。该类标记为sealed 以阻止发生派生,而派生可能会增加实例。此外,变量标记为readonly,这意味着只能在静态初始化期间(此处显示的示例)或在类构造函数中分配变量。该实现与前面的示例类似,不同之处在于它依赖公共语言运行库来初始化变量。它仍然可以用来解决Singleton模式试图解决的两个基本问题:全局访问和实例化控制。公共静态属性为访问实例提供了一个全局访问点。此外,由于构造函数是私有的,因此不能在类本身以外实例化Singleton类;因此,变量引用的是可以在系统中存在的唯一的实例。潜在缺点是,您对实例化机制的控制权较少。
using System;
namespace csPattern.Singleton
{
public sealed class Singleton
{
static readonly Singleton instance = new Singleton();
static Singleton()
{
}
Singleton()
{
}
public static Singleton Instance
{
get
{
return instance;
}
}
}
}
方法五:延迟初始化。初始化工作有Nested类的一个静态成员来完成,这样就实现了延迟初始化,并具有很多的优势,是值得推荐的一种实现方式。
using System;
namespace csPattern.Singleton
{
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();
}
}
}
总之,有各种不同的方式实施的单例模式在C#,个人偏好是解决4,解决方案5好一些,但麻烦比2或4个,它提供的好处似乎只有很少有用的。不会使用方案1,也不会使用3,因为他没有方案5好。
原文见:http://www.yoda.arachsys.com/csharp/singleton.html
- singleton设计模式的C#实现(上)
- Singleton设计模式的C#实现(下)
- Singleton设计模式的C#实现(1)
- Singleton设计模式的C#实现(2)
- Singleton设计模式的C#实现[转]
- Singleton设计模式的C#实现(转载)
- singleton设计模式的C#实现(上)
- Singleton设计模式的C#实现(下)
- singleton设计模式的C#实现(上)
- Singleton设计模式的C#实现
- Singleton设计模式的C#实现
- C#实现Singleton设计模式
- C#实现Singleton模式
- c#设计模式- Singleton模式
- Singleton模式的实现方式 C#
- Singleton设计模式的C++实现详解
- 设计模式singleton的C++实现源码
- javascript中Singleton设计模式的实现
- 在线三维地图网站
- 给同学的祝福
- OpenGL embedded is gaining ground?
- c#对xml文件常用操作
- 【半ZZ】红黑树 VS AVL树
- Singleton设计模式的C#实现
- C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值
- 常用正则表达式总结
- 奔放的80后
- 【ZZ】C++家教中总结的知识点
- Nagle算法
- PHP's numeric variable name...
- 英语四六级完型填空的步骤
- ftp服务器暴力入侵防护