singleton和静态类实现方式类似,当然也有些不同,比如静态类不能实例化,不能实现接口等。但是在真正使用的时候,却体现不出差别,也就是说,很难取舍到底选谁,我在使用的时候发现使用静态类貌似更加方便。高手来谈谈看法和观点吧。

解决方案 »

  1.   

    singleton是面向对象思想,静态类或变量是以前遗留的方式, 其他没啥区别
      

  2.   

    静态类是C#下实现Singleton模式的一种手段。你是拿马和白马在比较,没有意义。
      

  3.   

    非也,标准的singleton实现方式并没有使用静态类。而是一种创建型的模式,本质上是实例化了一个类,但只实例化一次。维基百科上的标准实如下:
    public class Singleton {
     
        private static final Singleton INSTANCE = new Singleton();
     
        // Private constructor prevents instantiation from other classes
        private Singleton() {
        }
     
        public static Singleton getInstance() {
            return INSTANCE;
        }
     
    }
      

  4.   

    本帖最后由 caozhy 于 2011-06-11 18:54:37 编辑
      

  5.   

    那你的意思是,c#中,使用静态类实现singleton是一种很普遍的做法??
    或者在C#中实现singleton模式,这两种实现方式都是可以的,但是哪一种更加“正确”点呢?
    两种实现方式可以互换吗??
      

  6.   

    没有更正确一说。静态类就是相当于Singleton。当然,你要明白,静态类是程序集唯一的。
      

  7.   

    此问题是我在一次面试中得到的,当初我的理解和你类似,以为静态类就是singleton的实现。但是经过辩论,我觉得从单纯的singleton的定义角度来说,静态类不属于singleton模式,因为它没有创建实例。google中也搜索到一些关于singleton和静态类的区别,但是看后也没啥太多感觉。
      

  8.   


    谁说创建实例才叫Singleton?典型的教条主义+书呆子。
      

  9.   


    1,C#设计模式这本书中,把singleton放在创建型模式中。
    2,维基百科的定义:In software engineering, the singleton pattern is a design pattern used to implement the mathematical concept of a singleton, by restricting the instantiation of a class to one object
    3.微软msdn中对于实现单件模式的代码示例如下:
    using System;public class Singleton
    {
       private static Singleton instance;   private Singleton() {}   public static Singleton Instance
       {
          get 
          {
             if (instance == null)
             {
                instance = new Singleton();
             }
             return instance;
          }
       }
    }
    并没有使用静态类。
    4,搜了google,没有发现用静态类来作为单件模式的实现方式。
    因此,可以推动静态类和单件模式还是不能完全划等号。判断是否是单件模式,我的标准是维基百科的定义。欢迎提出反对意见,欢迎辩论。
      

  10.   

    如果追溯到10年前,gof(以及其它使用java开发的人)怎么也不会想到要求java语言支持这样的功能:用static修饰的class,或者让一个类型具有public static属性可以从其它类型对象实例来访问的。至于你说“没有发现用静态类来作为单件模式的实现方式”,这不是明显的嘛。如果你觉得静态类好,那么就不回去使用什么单件模式了嘛。
      

  11.   

    本帖最后由 caozhy 于 2011-06-13 02:22:53 编辑
      

  12.   

    额,静态类和单件是不能拿来比较的静态类的语义是全局唯一代码段,而单件的语义是全局唯一对象实例语义上是完全不同地,不能说起修饰都是“全局唯一”就放一块比较如果是这样那么所有public修饰的东西我们不是都得比较一翻了另外:ls几位都说了,如果要研究对象设计,那么请先抛开代码。对象设计是本身哲学性和世界观的表达。如何把现实的东西用概念还原表达出来,才是对象设计的实质。而代码则是体现你头脑里那个概念模型的工具。所以这也很好的体现上面几位的观点
    1。与其纠结那个代码,不如学习人家如何思考,如何表达这个世界2。模式受限于技术手段,不同时期,技术手段不同。即使是同一个人在同一个世界观下的模型,在不同技术时期也不一样,毕竟技术手段不一样。这个你比较一下。C#,basic,python,prolog这几个语言风格写出来的费波拉契数就明白了,费波拉契数的计算规则是不会变滴,但是在对象式,过程式,申明式,逻辑式中他们代码手段则完全不同3。各种设计模式书里所提到的那些例子,实际上也都是程序员个人的世界观和策略体现。或许这些例子表达了一些通行的策略,但是实际上每个人世界观和策略实际是不同地。所以针对同一个问题,让我和楼上几位星星去把问题抽象出来,我们答案也许都是不一样滴。这里面并没有谁正确,谁错误的区别,只是有谁更符合那个项目而已(当然也有可能,我们几位都给出了一样的答案,但也只能表明对于这个项目,这个问题我们在世界观上相近,而策略上也是英雄所见略同而已)
      

  13.   

    这也是大多数人觉着设计模式难学的原因代码看的明白却不知道如何用在项目里。这个主要是因为太关注代码了,而忽略了去在头脑里去还原设计者的场景和当时人家的头脑中是如何还原那个场景的我见过很多人学习设计模式就和在学校里学习hello world差不多。他们会一行一行地用手把书上的那个例子敲出来,然后运行,接着感叹!神了,太神奇,原来可以这样哦!但是后面呢,没有后面了,他除了了解到了一个“新”名词以外,就没啥了实际上,我遇见的大多数设计模式学的好的人,甚至都没有完整滴把设计模式从头到尾读完 ,因为实在没有必要读完,我们只是需要还原一下场景和思考一下设计者当时所持的世界观和策略就ok。另外提一句:别把设计模式看的太重,设计模式实际基于的理论是那5个基础设计原则。
    只要你不是按过程的写法,只要你按照还原实现模型对象理念,只要你是按照那5个基础设计原则去设计。出来的东西80%就是符合模式滴。为什么设计模式被吹的神乎其神,这就是原因--80%可不是一个随便的数字,我个人虽然不太看重书本上那些模式,但是也不得不佩服总结出来的人。你写出来的东西,能有80%的东西都在上面找到,相当了不起的总结。
      

  14.   

    恰巧最近在看最老的那版设计模式(HeadFirst设计模式和大话设计模式也看过,但是那时候对OO语言的特性没有太好的认识,所以看了半天很糊涂)。设计模式是在一定的用途或者目的环境下,如何发挥OO语言特性的经验总结。
    原著优秀的地方就在于,没有让你读死书,读书死,而是尽量把分析和权衡、取舍的过程讲出来,并且给了你一不止一个参考实现。至于Singleton模式和静态类,只有一个类的Singleton和静态类相比没什么代码行上的优势(差十行二十行?)。
    但是,面向对象的编程,不是追求代码行最少,而是强调设计的灵活性。
    单例模式有一个增强,就是有派生类的单例,在那种情况下,你看看静态类如何模拟?
      

  15.   

    静态是singleton的一种啊,就像青年人和人比较哪个更好一样
      

  16.   

    从编码角度来看,到处new Class().Method() 很别扭啊
      

  17.   


    这是显而易见的事情,比如单件,内存缓存的是实例。我可以在对象本身放入事件,我也可以clone,copy,hash,也可以把他当做参数传递给另外的一个对象请问静态类能否做这些事情
      

  18.   

    静态类是C#下实现Singleton模式的一种手段。
      

  19.   

    用Class Factory实现Singleton的飘过~~~
      

  20.   

    好吧...其实这个可以看做lz所说的传统Singleton实现的特例.
    两种差别挺大的.具体根据需要取舍.没有谁好谁不好之说.
      

  21.   

    singleton是面向对象思想,静态类或变量是以前遗留的方式, 其他没啥区别
      

  22.   

    引用15楼兄弟的回复:一种优雅的语言,不需要设计模式。貌似是第一次看到这种说法,很震撼啊~~回到楼主的问题。楼主所纠结的不过是单例模式的不同实现手段而已。我贴段代码,楼主可以判断下这算不算单例模式的实现:BOOL CMyApp::GetInstance()
    {
        HANDLE hMutex = CreateMutex(NULL, TRUE, "Application");
        if( hMutex != NULL )
        {
            if (GetLastError() == ERROR_ALREADY_EXISTS)
            {
                return FALSE;
            }
        }
        return TRUE;
    }PS : 这段代码的作用就是只开一个应用程序实例。如果严格对号经典的单例模式的实现,这个很难算上是单例模式了。
    但是如果仔细想想单例模式背后所体现的思想,这个不还是单例模式的一种实现吗?不过换了个马甲而已,哈哈~~楼主所提到的问题,就是经典的“饿汉式”(静态)和“懒汉式”(Double-Check)的两种实现。
      

  23.   

    讨论了这么多,也没有个定论。到底,静态类算不算singleton的一种实现手段?本人觉得,从背后的思想来看,是可以的算的,因为他保证了全局唯一调用入口。
    但从实际定义出发,可以不算,因为他没有实例话。
    换句话说。单例模式可以很方便的扩展为双例模式,但是静态类就没办法做到这一点。
      

  24.   

    singleton和静态类是没有可比性的:
    首先:singleton是设计模式,说白了是最佳实践。而静态类则是c#的一种类型机制,他们有着本质的区别。  
         当然singleton也用到了静态变量,他虽然不能被实例化但绝不是静态类只是单例的构造方法是私有的而已。
    其次:在单例模式中含有了静态成员,正是静态成员的存在使得你觉得他和静态类没有区别。
         其实是这样的,当你掉用静态类时单例模式才去初始化这个类,从而传个你一个实例。
         而静态类是在应用程序加载内存的时候就已经分配了内存空间,既初始化了。
         所以建议你多用单例而不要静态类,在实际项目中静态类是应该避免使用的。这个牵涉到性能问题。
      

  25.   

    不好意思上面写错了:更正---
    singleton和静态类是没有可比性的:
    首先:singleton是设计模式,说白了是最佳实践。而静态类则是c#的一种类型机制,他们有着本质的区别。   
      当然singleton也用到了静态变量,他虽然不能被实例化但绝不是静态类只是单例的构造方法是私有的而已。
    其次:在单例模式中含有了静态成员,正是静态成员的存在使得你觉得他和静态类没有区别。
      其实是这样的,当你掉用单例的静态成员时单例模式才去初始化这个类,从而传个你一个实例。
      而静态类是在应用程序加载内存的时候就已经分配了内存空间,既初始化了。
      所以建议你多用单例而不要静态类,在实际项目中静态类是应该避免使用的。这个牵涉到性能问题。
      

  26.   

    那你的意思是,c#中,使用静态类实现singleton是一种很普遍的做法??
    或者在C#中实现singleton模式,这两种实现方式都是可以的,但是哪一种更加“正确”点呢?
    两种实现方式可以互换吗??
      

  27.   

    静态类是C#下实现Singleton模式的一种手段。你是拿马和白马在比较,没有意义。
      

  28.   

    有区别啊。。
    静态类在加载程序集的时候就会初始化类程序,Singleton模式只有在使用到的时候才会实例化对象。
    而且在很多情况下,比如你加载一个配置文件,加载的结果是一堆键值对,你用静态类怎么做??每次都读取??如果你再静态类里面做了 如果 某某是空 就去读取文件的操作,那和Singleton模式有何区别?
      

  29.   


    请问高人,发帖讨论各抒己见,我发表我的看法,我可没标榜我的是正确的。
    如果只允许所谓的高人发言,我看CSDN也不过如此。
      

  30.   

    向各位学习。。
    我也讲讲个人观点。
    Singleton模式 和 静态类  比较? 
    Singleton模式是一种设计模式。设计模式有千千万万种,但基于基础是解决一系列问题的一个解决方案。
    所以说Singleton模式是一个解决方案的抽象命名。具体解决那些问题上面各位都说的很清楚。
    静态类:这东西太玄了,说到都头痛,用到肯定会更头痛。 静态类应该可以处理任何问题。只要你肯写。大伙讨论的可能是singleton模式可能使用到静态类实现?
    复制3楼的代码using System;public class Singleton
    {
      private static Singleton instance;  private Singleton() {}  public static Singleton Instance
      {
      get  
      {
      if (instance == null)
      {
      instance = new Singleton();
      }
      return instance;
      }
      }
    }我不知道这代码是哪来的,3楼说是维基百科,个人认为:第一这个Singleton貌似写错了,第二这也貌似不是静态类。我晕呼呼
      

  31.   

    本帖最后由 caozhy 于 2011-06-13 16:16:13 编辑
      

  32.   

    晓得 singleton ,C++ 里面貌似没静态类这个概念吧
      

  33.   

    设计模式是个骗局就说在C#中,用static class来实现那个所谓的单间模式简直是一种乱伦而将构造函数声明为private
    添加一个Create方法和一个static成员
    都用不了你10行代码而这10行代码所换来的东西简直就是超值是Static class无法比拟的