单例模式和全局静态变量(类)的区别?
貌似他们都可以达到相同的效果, 他们的应用范围 有没有指导方案呢?
对程序效率 ,资源使用上 有没有区别呢?
------解决方案--------------------其实全局静态变量(类)就是单例模式在语言层面上的一种实现。
------解决方案--------------------http://stackoverflow.com/questions/519520/difference-between-static-class-and-singleton-pattern
------解决方案--------------------
如果你关心的仅是这些,那么这种差别无足挂齿。
------解决方案--------------------有这样一种设计需求:
需要控制应用程序中的某种类型的实例的数量,而当这个数量被限定为1的时候,就成了所谓单例
但无论如何,它针对的是应用程序中的对象,需要考虑并发的业务逻辑;
还有一种需求:
需要描述和处理应用程序(或组件)自身及其依赖的场景或者环境,这样的对象在运行时刻是唯一的;
无论使用哪种高级PL,都可以有很多的手段去实现这2种效果,
而第二种需求(以及第一种需求的单例并且不含有并发逻辑),
在C#中,可以用静态类型和静态成员这种简单的编程方式去实现。
------解决方案--------------------单例模式在C#的一种实现手段就是使用静态类。
------解决方案--------------------不要被C++中那种单键模式的实现方式所迷惑,这是因为C++不支持静态类,才需要绕一个大弯子。虽然看上去这两者差别很大,但是C#实现单键模式的首选就是使用静态类。
------解决方案--------------------单例模式不一定只有一个实例,所以最好不要用全静态类,
------解决方案--------------------使用静态对象同样可以处理并发问题,使用GoF Style的设计,也未必就没有并发的问题,事实上静态对象同样是实现Singleton的一种形式。只是从并发的角度看,它和GoF Style的设计一样,需要额外的代码。
------解决方案--------------------简单的单例完全可以使用静态类替代。
但是如果需要抽象、继承、接口,静态类就无能为力了,不过静态变量在一定程度上也是可以的。
注意静态类与动态类中的静态变量对于单例实现还是有区别的。
------解决方案--------------------
单例的访问句柄在 instance上. 意思是: 你访问了一个 类下的 静态成员.
所以从这而言, 你不需要为这个静态成员 的public成员 提供 static 修饰符.
而静态类的访问句柄则直接是 这个 类本身.
如果你使用静态类, 那么你的所有对外方法都要是static的. 并且你的private成员也得是static的. 这一想都会头大. 而单例会避免这个东西
虽然, 最终由于instance的static化, 导致了 instance 下的所有成员也被动的 近似static化( static的本质, 却是实例类的使用方式 )
而我的观点是: 最终如果抛开编码过程, 只看待内存产物的话, 那么其实2者没有任何区别.