关与C#中使用singleton设计模式的问题.

来源:百度知道 编辑:UC知道 时间:2024/06/10 23:39:04
我在相关资料中读到:
========================================================
有些时候在整个应用程序中,会要求某个类有且只有一个实例,这个时候可以采用Singleton模式进行设计。
...
下面是利用.NET Framework平台优势实现Singleton模式的代码:
sealed class Singleton
{
private Singleton();
public static readonly Singleton Instance=new Singleton();
}
========================================================
问题来了:直接使用C#/.NET中的静态类(static class),与使用所谓【singleton设计模式】设计出来的类有什么区别?
static class是不是就是.NET对【singleton设计模式】的一种实现?
<问题补充>:
#1 to hlppxxx :
“静态类可以是多例的”这句怎么理解?是不是说静态类可以被实例化?实例化静态类有何意义?
#2 to kadbbz :
首先感谢你的例子!
对于“静态类是在Assembly加载的时候进行初始化,不能变更,单件模式的普通类更加灵活。”这句,
冒昧请求阁下列举一个能显示 “单件模式的普通类更加灵活”的例子。
#3 to chenli0513 :
我清楚理解c++中的singleton。
我迷惑的是c#/dotnet中的static class与singleton设计模式的初衷有何不同.
</问题补充>

首先,面向对象的设计中比较忌讳静态类,因为它不是面向对象的!
然后静态类是在Assembly加载的时候进行初始化,不能变更,单件模式的普通类更加灵活。
最后,你给出的做法并不是一个很好的选择,一般的说是这样的:
sealed class Singleton
{
private static Singleton _instance
private Singleton();
public static Singleton GetInstance();
{
if(null == _instance)
{
Singleton._instance = new Singleton();
}
return Singleton._instance;
}
}

实用的时候只需要Singleton.GetInstance()即可。

Ps:更加灵活是指这个单间的构造时间更加灵活,比如我上面的例子里面,如果没有人执行Singleton.GetInstance(),那么Singleton._instance就会一直是空,而不占用内存。如果使用在static filed定义的时候就实例化,相当于在assembly加载起来的时候就为Singleton._instance赋值,不管是否被使用,占用内存是肯定的了:)

用静态成员变量来实现单件模式, 是利用了C#的语言特性。

即:延迟加载 (Lazy Load),和线程安全。

就是说,当外界没有访问这个Instance的时候,他是没有实例化的, 当外界访问了这个Instance的时候, C#就会调用这个类的默认静态构造函数去实例化这个Instance。 实际上编译器会把这个代码Instance=new Singleton(); 放到类的静态构造函数里。

由于C#类的静态构造函数只能一个线程访问,所以保证了线程安全。

当然你也可以用另外的方法实现。最终实现的结果是一样的:即某个类有且只有一个实例。

不是的…静态类可以是多例的…比如Path,