Java中单例模式是一种常见的设计模式,单例模式分为:饿汉式单例模式、懒汉式单例模式、登记式单例模式、枚举式单例模式。作为对象的常见模式的单例模式,确保某一类只有一个实例,而且自行实例化并向整个系统提供这个实例。
单例模式的特点:
- 单例类只能有一个实例。
- 单例类必须自己创建自己的唯一实例。
- 单例类必须给所有其他对象提供这一实例。
举例说明:在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
【转载使用,请注明出处:http://blog.csdn.net/mahoking】
饿汉式单例模式用例:
/** * 饿汉式单例类 * @author Mahc * */ public class EagerSingleton { private static EagerSingleton instance = new EagerSingleton(); /** * 私有的构造方法/构造函数 */ private EagerSingleton(){} /** * 静态工厂方法 * @return instance */ public static EagerSingleton getInstance(){ return instance; } }
饿汉式是典型的空间换时间,当类装载的时候就会创建类的实例,在未使用时,就已经创建出来,然后每次调用的时候,就不需要再判断,节省了运行时间。
懒汉式单例模式用例:
/** * 懒汉式单例类 * @author Mahc * */ public class LazySingleton { private static LazySingleton instance = null; /** * 私有的构造方法/构造函数 */ private LazySingleton(){} /** * 静态工厂方法 * 由于懒汉式的实现是线程安全的 ,所以使用了 synchronized * @return instance */ public synchronized static LazySingleton getInstance() { if(instance == null){ instance = new LazySingleton(); } return instance; } }
懒汉式是典型的时间换空间,就是每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间。当然,如果一直没有人使用的话,那就不会创建实例,则节约内存空间。
由于懒汉式的实现是线程安全的,这样会降低整个访问的速度,而且每次都要判断,所以需要更好的实现方式。
登记式单例模式用例:
/** * 登记式单例类 * 类似Spring里面的方法,将类名注册,下次从里面直接获取。 * @author Mahc * */ public class RegisterSingleton { private static Map<String, RegisterSingleton> map = new HashMap<String, RegisterSingleton>(); static{ RegisterSingleton singleton = new RegisterSingleton(); map.put(singleton.getClass().getName(), singleton); } protected RegisterSingleton(){} /** * 静态工厂方法,返还此类惟一的实例 * @param name * @return */ public static RegisterSingleton getInstence(String name){ if(name == null){ name = RegisterSingleton.class.getName(); } if(map.get(name) == null){ try { map.put(name, (RegisterSingleton)Class.forName(name).newInstance()); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } return map.get(name); } }
登记式单例模式,使用Class加载器,辅助Map对象将Singleton的name作为key值保存Value(Singleton的实例对象)。
本例使用枚举的关键字 enum 枚举式单例模式用例:
public enum EnumSingleton { /** * 定义一个枚举的元素,它就代表了Singleton的一个实例。 * @author Mahc */ uniqueInstance; }
测试各种样式的单例模式测试类:
public class TestSingleton { public static void main(String[] args) { //测试饿汉式模式 EagerSingleton eagerSingleton01 = EagerSingleton.getInstance(); EagerSingleton eagerSingleton02 = EagerSingleton.getInstance(); if(eagerSingleton01 == eagerSingleton02){ System.out.println("EagerSingleton\n" + true); } //测试懒汉式模式 LazySingleton lazySingleton01 = LazySingleton.getInstance(); LazySingleton lazySingleton02 = LazySingleton.getInstance(); if(lazySingleton01 == lazySingleton02){ System.out.println("LazySingleton\n" + true); } //测试登记式模式 RegisterSingleton registerSingleton01 = RegisterSingleton.getInstence(null); RegisterSingleton registerSingleton02 = RegisterSingleton.getInstence(null); if(registerSingleton01 == registerSingleton02){ System.out.println("RegisterSingleton\n" + true); } //枚举式模式 EnumSingleton enumSingleton01 = EnumSingleton.uniqueInstance; EnumSingleton enumSingleton02 = EnumSingleton.uniqueInstance; if(enumSingleton01 == enumSingleton02){ System.out.println("EnumSingleton\n" + true); } } }
【转载使用,请注明出处:http://blog.csdn.net/mahoking】
时间: 2024-12-25 08:08:36