工厂模式 - 单例模式
Posted simple-ly
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工厂模式 - 单例模式相关的知识,希望对你有一定的参考价值。
1、 单例模式
1.1、什么是单例模式
单例模式确保某一个类只有一个实例。而且自行实例化并向整个系统提供这个实例。这个类成为单例类。Java中,通常单例模式的构造方法是私有的,类只有一个唯一实例,类自己创建自己的实例,所有其他对象都使用这个唯一的实例。
1.2、饿汉式
饿汉式在类被加载时,static变量会被初始化。由虚拟机保证只会装载一次该类,所以是天然的线程安全的。
/** * 饿汉式单例 */ public class HungerSingleton { /** * 利用JVM的static机制保障唯一性,同时也保证了线程安全问题 */ private static final HungerSingleton instance = new HungerSingleton(); private HungerSingleton(){} public static HungerSingleton getInstance(){ return instance; } }
1.3、懒汉式
懒汉式的初始化动作被延迟到了方法调用。在类加载的时候,实例对象为null。在真正使用的时候调用getInstance()去初始化,延迟加载。利用synchronized保证线程安全。
/** * 懒汉式 */ public class LazySingleton { private static LazySingleton instance= null; private LazySingleton(){} /** * 利用synchronized关键字,对方法加锁,由于是静态方法,所有锁的是LazySingleton的类对象 */ synchronized public static LazySingleton getInstance(){ if(instance == null){ instance = new LazySingleton(); } return instance; } }
1.4、静态内部类
利用jvm确保唯一性和线程安全问题,内部类在getInstance()才会被加载并初始化内部类的instance静态变量,延迟加载。
/** * 静态内部类单例 */ public class StaticInnerSingleton { private StaticInnerSingleton(){} /** * 静态内部类,利用jvm确保唯一性和线程安全问题 */ private static class SingletonInstance { private static final StaticInnerSingleton instance = new StaticInnerSingleton(); } public static StaticInnerSingleton getInstance() { return SingletonInstance.instance; } }
1.5、枚举
最简单的单例,由JVM唯一性,并且天生的线程安全。
/** * 枚举单例 */ public enum EnumSingleton { /** * 定义一个枚举的元素,它就代表了Singleton 的一个实例。 */ INSTANCE; }
获取单例对象也很简单,只需要 EnumSingleton singleton = EnumSingleton.INSTANCE;
1.6、小结
四种单例。按延迟加载划分。非延迟加载的为:饿汉式和枚举。延迟加载的为:静态内部类和懒汉式。
如果有延迟加载的要求,静态内部类会比懒汉式好很多,毕竟懒汉式的同步锁摆在那。如果没有延迟加载的要求,饿汉式和枚举都行。
参考:
《Java与模式》
ps:书上没有静态内部类和枚举类的单例。这是以前学习就知道的单例手段。
以上是关于工厂模式 - 单例模式的主要内容,如果未能解决你的问题,请参考以下文章