Singleton模式

简述:构造的这种类型,它只能有一个对象。

这样做的优点是,有时候重复生成多个对象,但其实只需要用一个就够了。重复生成浪费资源。

实现Singleton有以下几种方法:

  1. 让构造函数设为private,在类里建立一个为public static final的对象
    public class  Sprite {
        public static final Sprite INSTANCE = new Sprite();
    
        private Sprite() {……}
    	
    }
  2.  让构造函数设置为private,让类里这个对象的实例private,设置一个public static的方法可以获取这个对象(这里用的就是static factory模式)
    public class  Sprite {
        private final Sprite INSTANCE = new Sprite();
    
        private Sprite() {……}
    
        public static Sprite getInstance() { return INSTANCE; }
    }

以上的两种方法有局限性,就是他们都是通过设置private来达到Singleton化的,而private的构造函数在一些反射方法里可以被特殊的调用。还有在Serializable(序列化)的时候比较麻烦,每当解析一个序列化的时候这个时候会产生一个新的对象,这样就造成我们之前说的唯一一个实例的初衷,这里的解决方案是复写Serialzable的readResolve方法,来继续维护Singleton。

Effect Java的作者提到了,最好的实现Singleton的方法,应该是使用枚举。

public enum Singleton {
    INSTANCE;
    
    // other metho
    public void execute () {
        // Perform operation here 
    }
}

使用的时候只要Singleton.INSTANCE就好,非常的简介优雅。这个方法是利用了Java确保枚举类型在程序里只初始化一次来实现的。

下面再介绍一下,在Android下一种实现Singleton模式的方法。最简单的是通过继承Application实现,这也是利用Android保证了一个app一个Application的实例的特点实现的。下面代码是把Volley里的RequestQueue单例化:

public class MyApplication extends Application{
    private static RequestQueue mRequestQueue;
    public static synchronized MyApplication getInstance(){
        return mInstance;
    }
     public static RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            mRequestQueue = Volley.newRequestQueue(getInstance());
        }
        return mRequestQueue;
    }
}

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>