Java单例模式

所谓单例模式,就是采取一定的方法保证在整个软件系统中,对某个类智能存在一个对象实例。

实现单例模式的思路是:
一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名 称);当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用;同时我们 还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。

实现单利模式的原则和过程:

  • 1.单例模式:确保一个类只有一个实例,自行实例化并向系统提供这个实例
  • 2.单例模式分类:饿单例模式(类加载时实例化一个对象给自己的引用),懒单例模式(调用取得实例的方法如getInstance时才会实例化对象)(java中饿单例模式性能优于懒单例模式,c++中一般使用懒单例模式)
  • 3.单例模式要素:

    a.私有构造方法
    b.私有静态引用指向自己实例
    c.以自己实例为返回值的公有静态方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*
* 单例模式: 饿汉式
* 食用方法:
* 1、 私有化类的内部构造器
* 2、创建私有的类的唯一的对象。
* 3、提供公共的类的调用方法,返回类的对象
*/
public class Bank {
// 1、私有化类的内部构造器
private Bank() {}
// 2、提供类内部私有静态方法
private static Bank instance = new Bank();
// 3、提供公共的静态方法,返回类的对象
public static Bank getInstance() {
return instance;
}
}

饿汉式二,使用静态代码块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*
* 使用静态代码块,饿汉式单例模式
* @author mapan
*/
public class Order {
//1.私有化类的构造器
public Order() {
}

//2.声明当前类对象,没有初始化
//4.此对象也必须声明为static的
private static Order instance = null;
static {
instance = new Order();
}

public Order getInstance() {
return instance;
}
}

懒汉式单例模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
* 懒汉式单例模式:使用静态化代码块
* 线程是不安全的,使用时需要注意
*/
public class Order2 {
//1、私有化类的构造器
private Order2() {
}
//2.声明当前类对象,没初始化
//4.此对象也必须声明为static
private static Order instance = null;

//3.声明public、static 的返回当前类对象的方法
public static Order getInstance(){
if(instance == null){
instance = new Order();
}
return instance;
}
}

添加了synchronized同步锁来解决线程安全的问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//线程安全的单例模式:懒汉式
class Bank{
    private Bank(){}
    private static Bank instance = null;
    public static Bank getInstance(){
        //方式一:效率稍差
//        synchronized (Bank.class) {
//            if(instance == null){
//                instance = new Bank();
//            }
//            return instance;
//        }
        //方式二:效率更高
        if(instance == null){
            synchronized (Bank.class) {
                if(instance == null){
                    instance = new Bank();
                }
            }
        }
        return instance;
    }
}

单例模式应用场景

  1. Windows的Task Manager就是很典型的单例模式;
  2. windows的Recycle Bin也是典型的单例应用;
  3. 网站的计数器如访客数,不蒜子计数器等。