解决方案 »

  1.   

    有这样一种设计需求:
    需要控制应用程序中的某种类型的实例的数量,而当这个数量被限定为1的时候,就成了所谓单例
    但无论如何,它针对的是应用程序中的对象,需要考虑并发的业务逻辑;还有一种需求:
    需要描述和处理应用程序(或组件)自身及其依赖的场景或者环境,这样的对象在运行时刻是唯一的;无论使用哪种高级PL,都可以有很多的手段去实现这2种效果,
    而第二种需求(以及第一种需求的单例并且不含有并发逻辑),
    在C#中,可以用静态类型和静态成员这种简单的编程方式去实现。
      

  2.   

    不要被C++中那种单键模式的实现方式所迷惑,这是因为C++不支持静态类,才需要绕一个大弯子。虽然看上去这两者差别很大,但是C#实现单键模式的首选就是使用静态类。
      

  3.   

    使用静态对象同样可以处理并发问题,使用GoF Style的设计,也未必就没有并发的问题,事实上静态对象同样是实现Singleton的一种形式。只是从并发的角度看,它和GoF Style的设计一样,需要额外的代码。
      

  4.   

    因为C#不是一种为并发编程而专门设计的语言,所以C#在处理并发的时候,都是需要代码层次的实现。可以说解决并发本身在C#中就是需要设计,以及设计模式的。但是确实有很多语言,可以从语言层面上保证并发,如果那些语言同时有静态类的概念的话,那么显然静态类可以适合所谓的“各种场景”了。因此,不支持所有场景,是C#的缺陷,或者说C#语言适用场景的局限,而不是“静态类”的局限,“静态类”无需为并发问题背书。
      

  5.   

    1.我说的单例模式详细解释在4楼,不是特指Gof的东西,
      Gof拿着代码说的充其量是OOPL,具体的过头了,不能算是设计模式,2.静态对象不能控制实例化的时机和规则,还有实例的数量,
      

  6.   


    静态类不用对实例化的时机和规则,还有实例的数量背书,但是它就是用来使得单键模式在C#语法层面支持的。这好比说CAD软件是用来辅助设计的,但是如果偏要说CAD本身没有设计的能力,这个就是偷换概念了。如果你用过静态类会发现,使用它实现单键模式变得更加容易,包括你所谓的“控制实例的数量”,事实上这已经不是单键模式,而是池模式了。另外,你一直在说静态对象,我不知道是不是你把静态成员和静态类搞混淆了。这两者可是完全不同的,在C/C++中也可以用static申明静态成员的。
      

  7.   


    单例的访问句柄在 instance上. 意思是: 你访问了一个 类下的 静态成员.
    所以从这而言, 你不需要为这个静态成员 的public成员 提供 static 修饰符.而静态类的访问句柄则直接是 这个 类本身.
    如果你使用静态类, 那么你的所有对外方法都要是static的. 并且你的private成员也得是static的. 这一想都会头大.  而单例会避免这个东西虽然, 最终由于instance的static化, 导致了 instance 下的所有成员也被动的 近似static化( static的本质, 却是实例类的使用方式 )
    而我的观点是:  最终如果抛开编码过程, 只看待内存产物的话,  那么其实2者没有任何区别.