单例模式和全局静态变量(类)的区别? http://stackoverflow.com/questions/519520/difference-between-static-class-and-singleton-pattern 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 有这样一种设计需求:需要控制应用程序中的某种类型的实例的数量,而当这个数量被限定为1的时候,就成了所谓单例但无论如何,它针对的是应用程序中的对象,需要考虑并发的业务逻辑;还有一种需求:需要描述和处理应用程序(或组件)自身及其依赖的场景或者环境,这样的对象在运行时刻是唯一的;无论使用哪种高级PL,都可以有很多的手段去实现这2种效果,而第二种需求(以及第一种需求的单例并且不含有并发逻辑),在C#中,可以用静态类型和静态成员这种简单的编程方式去实现。 不要被C++中那种单键模式的实现方式所迷惑,这是因为C++不支持静态类,才需要绕一个大弯子。虽然看上去这两者差别很大,但是C#实现单键模式的首选就是使用静态类。 使用静态对象同样可以处理并发问题,使用GoF Style的设计,也未必就没有并发的问题,事实上静态对象同样是实现Singleton的一种形式。只是从并发的角度看,它和GoF Style的设计一样,需要额外的代码。 因为C#不是一种为并发编程而专门设计的语言,所以C#在处理并发的时候,都是需要代码层次的实现。可以说解决并发本身在C#中就是需要设计,以及设计模式的。但是确实有很多语言,可以从语言层面上保证并发,如果那些语言同时有静态类的概念的话,那么显然静态类可以适合所谓的“各种场景”了。因此,不支持所有场景,是C#的缺陷,或者说C#语言适用场景的局限,而不是“静态类”的局限,“静态类”无需为并发问题背书。 1.我说的单例模式详细解释在4楼,不是特指Gof的东西, Gof拿着代码说的充其量是OOPL,具体的过头了,不能算是设计模式,2.静态对象不能控制实例化的时机和规则,还有实例的数量, 静态类不用对实例化的时机和规则,还有实例的数量背书,但是它就是用来使得单键模式在C#语法层面支持的。这好比说CAD软件是用来辅助设计的,但是如果偏要说CAD本身没有设计的能力,这个就是偷换概念了。如果你用过静态类会发现,使用它实现单键模式变得更加容易,包括你所谓的“控制实例的数量”,事实上这已经不是单键模式,而是池模式了。另外,你一直在说静态对象,我不知道是不是你把静态成员和静态类搞混淆了。这两者可是完全不同的,在C/C++中也可以用static申明静态成员的。 单例的访问句柄在 instance上. 意思是: 你访问了一个 类下的 静态成员.所以从这而言, 你不需要为这个静态成员 的public成员 提供 static 修饰符.而静态类的访问句柄则直接是 这个 类本身.如果你使用静态类, 那么你的所有对外方法都要是static的. 并且你的private成员也得是static的. 这一想都会头大. 而单例会避免这个东西虽然, 最终由于instance的static化, 导致了 instance 下的所有成员也被动的 近似static化( static的本质, 却是实例类的使用方式 )而我的观点是: 最终如果抛开编码过程, 只看待内存产物的话, 那么其实2者没有任何区别. datagridview 和数据库问题 ThreadPool使用问题 如何在页面上直接绑定实体对象? 高分:關於windform中的tabControl的使用 C#中在循环里如何生成多个lable组件???? 关于正则表达式验证的问题... 为什么数据库成功还原后在前台就不能进行其它操作了? 在c#.net网页制作 varchar 转 bigint 该怎么办? 多任务,多线程服务端程序设计的问题. 关于友情强档的数据结构的问题 stringsplitoptions 无效 请问,如何在程序中发邮件
需要控制应用程序中的某种类型的实例的数量,而当这个数量被限定为1的时候,就成了所谓单例
但无论如何,它针对的是应用程序中的对象,需要考虑并发的业务逻辑;还有一种需求:
需要描述和处理应用程序(或组件)自身及其依赖的场景或者环境,这样的对象在运行时刻是唯一的;无论使用哪种高级PL,都可以有很多的手段去实现这2种效果,
而第二种需求(以及第一种需求的单例并且不含有并发逻辑),
在C#中,可以用静态类型和静态成员这种简单的编程方式去实现。
Gof拿着代码说的充其量是OOPL,具体的过头了,不能算是设计模式,2.静态对象不能控制实例化的时机和规则,还有实例的数量,
静态类不用对实例化的时机和规则,还有实例的数量背书,但是它就是用来使得单键模式在C#语法层面支持的。这好比说CAD软件是用来辅助设计的,但是如果偏要说CAD本身没有设计的能力,这个就是偷换概念了。如果你用过静态类会发现,使用它实现单键模式变得更加容易,包括你所谓的“控制实例的数量”,事实上这已经不是单键模式,而是池模式了。另外,你一直在说静态对象,我不知道是不是你把静态成员和静态类搞混淆了。这两者可是完全不同的,在C/C++中也可以用static申明静态成员的。
单例的访问句柄在 instance上. 意思是: 你访问了一个 类下的 静态成员.
所以从这而言, 你不需要为这个静态成员 的public成员 提供 static 修饰符.而静态类的访问句柄则直接是 这个 类本身.
如果你使用静态类, 那么你的所有对外方法都要是static的. 并且你的private成员也得是static的. 这一想都会头大. 而单例会避免这个东西虽然, 最终由于instance的static化, 导致了 instance 下的所有成员也被动的 近似static化( static的本质, 却是实例类的使用方式 )
而我的观点是: 最终如果抛开编码过程, 只看待内存产物的话, 那么其实2者没有任何区别.