很多类里都有 public static XXX getInstance(){ ...... return this;}
这样的静态方法,来获得该类的实例,那么为什么不选用XXX xxx=new XXX();的方法来获得实例呢?是不是因为XXX类往往是抽象类而不能new,但是又想用它的实例?

解决方案 »

  1.   

    一种可能是单态。
    就是这个类只能有一个对象所以在getInstance方法里构造一个对象
    返回的总是同一个对象。再一种可能处于设计考虑。
    比如现在用spring就很少有new。
    原因最好看一下设计模式的书。
    我看过《设计模式》感觉不错。
      

  2.   

    是“四人帮”写的那本基于C语言的设计模式么?那些东西在J2EE开发过程中从来没用过,因为J2EE的开发模式很固定,不像桌面应用那样灵活多变,SO,无法真正领悟23种设计模式的精髓。
      

  3.   

    那么A a1=A.getInstance();
    A a2=A.getInstance();不就是两个了么??   
      

  4.   

    一般是这样用  
      Class Afactory{
         A a=null;
         public getA(){
            if(A!=null){
               a= new A();
               return a;
            }else{           return a;
            }
         }
      }这样如果调用两次getA()的话实际上是一个对象有两个引用?
      

  5.   

    这样用的目的和结果是:保证系统中永远都只会有一个该类的实例,sun的教材称为(Singleton)单子模式,要使用这种模式实现保证对象的单一性的两个要点是1.getInstance()一定是static的,2.构造方法必须是private的,保证用户只能通过static方法getInstance()来取得该类的唯一实例,而不能通过常规的new XXX()来实例化,象这样的不论定义多少个引用,
    A   a1=A.getInstance(); 
    A   a2=A.getInstance();
    ………
    ……
    ……

    它的引用总是引用的同一个的对象(static变量总是会在类载入内存时就首先进行初始化),不论有多少个都是同一个对象。 
    第一次回答,不知道说明白了没有。
      

  6.   

    getInstance() 不完全是单子模式 
    你可以直接看JDK里面怎么写的
      

  7.   

    getInstance()  提供一个获得对象实例的统一方式,类似Factory的。最典型的是Calendar, 我贴部分代码如下    public static Calendar getInstance()
        {
            Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault());
    cal.sharedZone = true;
    return cal;
        }    private static Calendar createCalendar(TimeZone zone,
       Locale aLocale)
        {
    // If the specified locale is a Thai locale, returns a BuddhistCalendar
    // instance.
    if ("th".equals(aLocale.getLanguage())
        && ("TH".equals(aLocale.getCountry()))) {
        return new sun.util.BuddhistCalendar(zone, aLocale);
    } // else create the default calendar
            return new GregorianCalendar(zone, aLocale);
        }
    可见,getInstance 只是一种得到实例的方法而已,不一定都是singleton 模式
      

  8.   

    按照6楼的说法

    它的引用总是引用的同一个的对象(static变量总是会在类载入内存时就首先进行初始化),不论有多少个都是同一个对象。   
    第一次回答,不知道说明白了没有。

    A a1=A.getInstance();   
    A a2=A.getInstance(); 如果我这么写的话,a1,a2实际上是同一个对象的不同引用,那么a1改变了,a2也跟着改变了,类似指针?
      

  9.   

    9楼的说法还是有点问题
    A1,A2,都是只是引用,而不是真正的对象,他们的共同点是,引用的对象是同一个,准确的说,是A1引用的对象改变了,意味着A2引用的对象也改变了,因为他们引用的是同一个对象,而你说的,A1改变,A2跟着改变的说法是有问题的,因为A1引用和A2引用 两个引用本身是没有关系的,比如A1,跑去引用NULL了,而A2,依然引用的是原来的那个对象,对象本身没有改变。引用的确类似于指针,它们存贮都是实际对象的内存地址,而不是对象本身,不知道说明白了没有。
      

  10.   

    比如说
    A   a1=A.getInstance();       
    A   a2=A.getInstance();   a1.getValue=5;
    a2.getValue=5;
    a1.add(1);
    a1.getValue=6;
    a2.getValue=6;
    楼上是不是这个意思??A a1=new A();
    A a2=a1;
    和上面说的是不是就是一致的?
      

  11.   

    你说的是表面体现,从外部体现上说就是这样的,我上边已经说过了,这种模式的构造方法是private的,就意味着 你不可能通过A   a1=new   A(); 这样的方式获得该类的实例,你只能通过A.getInstance();的方式来获得这个类的事例,这也就意味着,不论A1,A2,A3……引用的都是同一对象,得到的值当然是同样的了,也就是说你不论是对a1,a2进行操作都操作的是同一对象。
      

  12.   

    单子模式
    把构造方法私有
    用getInstance()来得到
    保证只有一个对象的产生···
    别的类要调用到它的话,只能用A.getInstance()来拿到它的对象··
    不能用new
      

  13.   

    sdfsdf
      

  14.   

    我们将构造函数的修饰符设为了private,也就是外部不能通过new ()直接实例化对象,而只能是通过getInstance()来进行。
      

  15.   

    getInstance 当一个对象使用的时候和当成一个函数使用的时候用什么区别呢?