一、单例模式概述
单例模式(Singleton-Pattern)是 Java 中最简单的设计模式之一,这种类型的设计模式属于对象创建型模式。
作用:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
二、理解单例模式
某些类创建对象是非常耗时耗内存和复杂的,这种类创建的对象我们称之为重量级对象(反之,轻量级对象),如果需要使用重量级类,一般把这个类设计为单例对象模式。
单例对象模式好处有:
1)保证对象在内存仅有一个,减少内存开销
2)使用者不用考虑创建细节,使用方便
3)可以控制对象的创建时刻
代码实现单例模式的关键点:
1)这个类在整个 JVM 中仅有一个对象实例
Java 中对象的创建方式有:
a)new
b)反射(reflect)
c)反序列化(deserialize)
d)克隆(clone)
2)提供一个访问它的全局访问点
a)公开的静态变量(不利于扩展)
b)一个公开的静态方法,返回唯一实例
三、实现单例模式方式
(1)饿汉式:立即创建、线程安全
package 饿汉式; public class SingletonClass { //私有静态变量,创建唯一实例 final:避免再次赋值(可加可不加) private static final SingletonClass ONLY=new SingletonClass(); //私有构造方法,屏蔽外部的 new(外部无法访问此类) private SingletonClass(){} //一个公开的静态方法,返回唯一实例,提供一个全局的访问点 public static SingletonClass getInstance(){ //...其他代码 return ONLY; } public void f(){ System.out.println("恶汉式单例模式"); } }
(2)懒汉式:延时创建、线程不安全
package 懒汉式; public class SingletonClass { //私有静态变量,保存唯一实例 private static SingletonClass ONLY; //私有构造方法,屏蔽外部的 new(外部无法访问此类) private SingletonClass(){} //一个公开的静态方法,返回唯一实例,提供一个全局的访问点 public static SingletonClass getInstance(){ if(ONLY==null){ //...线程不安全 ONLY=new SingletonClass(); } //...其他代码 return ONLY; } public void f(){ System.out.println("懒汉式单例模式"); } }
//缺点:多线程情况下不安全
(3)加锁的懒汉式:延时加载、线程安全、同步情况下效率低
package 加锁懒汉式; public class SingletonClass { //私有静态变量,保存唯一实例 private static SingletonClass ONLY; //私有构造方法,屏蔽外部的 new(外部无法访问此类) private SingletonClass(){} //一个公开的静态方法,返回唯一实例,提供一个全局的访问点 public synchronized static SingletonClass getInstance(){ if(ONLY==null){ //...线程不安全(解决方案:synchronized) ONLY=new SingletonClass(); } //...其他代码 return ONLY; } public void f(){ System.out.println("加锁懒汉式单例模式"); } }
//缺点:同步情况下效率低,即当 SingletonClass 的对象已经被创建,多线程情况下因为有 synchronized 存在,还需要等待解锁。
eclipse 中字母大小写转换快捷键:
ctrl+shift+x 转为大写
ctrl+shift+y 转为小写