单例设计模式(singleton)

来源:互联网 发布:检查语法错误的软件 编辑:程序博客网 时间:2024/05/18 03:03

      单例设计模式的概念

           作为对象创建模式,档里模式确保某个类只有一个实例对象,而且自行创建实例并向整个系统提供这个实例。这个类称为单例类!


      单例模式的提点

          1,单例类只能有一个实例

          2,单例类的唯一实例必须自己创建

          3,单例类必须向系统提供这个唯一的实例


饿汉单例类

public class EagerSingleton {        //在类加载创建实例    private static EagerSingleton mSingleton=new EagerSingleton();        //私有构造方法    private EagerSingleton(){}        //静态工厂方法    public static EagerSingleton getInstance(){                return mSingleton;            }}

饿汉单例模式是典型的以空间换时间,在类加载时就创建出来,不管你用不用。在随后的工厂方法中就不需要做判断,节省了运行的时间。


懒汉单例类

public class LazySingleton {        private static LazySingleton instance;        private LazySingleton(){}        public static LazySingleton getInstance(){        //双重检查枷锁        if(instance == null){                        synchronized (LazySingleton.class) {                                if(instance ==null){                    instance = new LazySingleton();                }            }        }                return instance;    }}

懒汉单例模式是典型的时间换空间,每次获取实例都会进行判断,是否需要创建实例,浪费判断的时间。当然如果一直没有调用此方法,则实例不会创建,节省空间。


添加一个持有单例实例的类内部类对象方法

啰嗦几个小知识点:1,类内部类是有static修饰的成员内部类。

                                    2,类级内部类相当于外部类的static成分,不存依赖关系。

                                    3,类级内部类相当于外部类的成员变量,只有在第一次使用时才会被加载。

 

public class SingletonWithHolder {        private static class SingletonHolder{                private static SingletonWithHolder instance = new SingletonWithHolder();            }        public static SingletonWithHolder getInstance(){                return SingletonHolder.instance;            }}

    当客户端第一次调用getInstance()时,SingletonHolder.instance第一次被读取,导致SingleHolder初始化,会在静态域创建SingleWithHolder实例。虚拟机只会

加载静态域一次,虚拟机保证了它的线程安全。此方法延迟初始化,并没有增加任何成本!

       

枚举单例

单元素的枚举类型已经成为实现singleton的最佳方法。

public enum EmunSingleton {        /**     * 定义一个枚举元素,它就代表这Singleton的一个实例     */        uiqueSingleton;        /**     * 单例的操作方法     */    public void singleOperation(){            }}


0 0