单例设计模式
编程题:写一个单例(Singleton)示例
-
Singleton:在Java中即指单例设计模式,它是软件开发中最常用的设计模式之一。
-
单:唯一
-
例:实例
-
单例设计模式,即某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式。
-
例如:代表JVM运行环境的Runtime类
单例模式要点
- 一是某个类只能有一个实例;
构造器私有化 - 二是它必须自行创建这个实例;
含有一个该类的静态变量来保存这个唯一的实例 - 三是它必须自行向整个系统提供这个实例;
对外提供获取该实例对象的方式:
(1)直接暴露
(2)用静态变量的get方法获取
单例模式几种常见形式
- 饿汉式:直接创建对象,不存在线程安全问题
- 直接实例化饿汉式(简洁直观)
- 枚举式(最简洁)
- 静态代码块饿汉式(适合复杂实例化)
- 懒汉式:延迟创建对象
- 线程不安全(适用于单线程)
- 线程安全(适用于多线程)
- 静态内部类形式(适用于多线程)
单例模式建议实现的形式
- 如果是饿汉式,枚举形式最简单
- 如果是懒汉式,静态内部类形式最简单
懒汉模式:多线程的下的单例模式写法
/*
* 懒汉式:
* 延迟创建这个实例对象
*
* (1)构造器私有化
* (2)用一个静态变量保存这个唯一的实例
* (3)提供一个静态方法,获取这个实例对象
*/
public class Singleton5 {
private static volatile Singleton5 instance;
private Singleton5(){
}
public static Singleton5 getInstance(){
if(instance == null){
synchronized (Singleton5.class) {
if(instance == null){
instance = new Singleton5();
}
}
}
return instance;
}
}
饿汉模式:静态代码块饿汉式(适合复杂实例化)
/*
* 懒汉式:
* 延迟创建这个实例对象
*
* (1)构造器私有化
* (2)用一个静态变量保存这个唯一的实例
* (3)提供一个静态方法,获取这个实例对象
*/
public class Singleton5 {
private static Singleton5 INSTANCE;
private Singleton5(){
}
static {
INSTANCE= new Singleton5();
}
}