单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。单例模式向系统外界提供了唯一的自身对象,外界无法自行创建一个单例的对象。
单例模式的类图 单例模式通常分为“饿汉式”和“懒汉式”,习啊下面分别展示它们的代码:
饿汉式:
package com.model.Singleton; /* * 饿汉式单例模式 * 特点: * 具有私有的构造方法 * 具有私有的静态属性,维护自身的实例,在初始化的时候就创建实例 * 具有共有的服务方法 */ public class Singleton { /* * 私有的静态的自身类对象 */ private static final Singleton singleton = new Singleton(); /* * 私有构造方法 */ private Singleton(){ } /* * 共有的静态获得实例方法 */ public static Singleton getInstance(){ return singleton; } }
懒汉式:
package com.model.Singleton; /* * 单例模式,懒汉式 * 不会在类初始化的时候就创建对象 */ public class SingletonLazyload { /* * 私有的静态的自身类对象 */ private static SingletonLazyload singleton; /* * 私有的构造方法 */ private SingletonLazyload(){ } /* * 共有的静态获得实例方法 */ public static SingletonLazyload getInstance(){ if(singleton == null){ singleton = new SingletonLazyload(); } return singleton; } }
单例模式的使用情况通常有两种:
l 直接新建单例对象。一般我们会加入一个private或者protected的构造函数,这样系统就不会自动添加public的构造函数了,因此只能调用里面的static方法,无法通过new来创建对象。
l 通过反射构造单例对象。反射时可以使用setAccessible方法来突破private的限制,我们需要做到直接新建单例对象的同时,在ReflectPermission(“suppressAccessChecks”)权限下使用安全管理器(SecurityManager)的checkPermission方法来限制这种突破。一般来说,这些事情都是通过应用服务器进行后台配置实现。 |