所谓单例模式,就是采取一定的方法保证在整个软件系统中,对某个类智能存在一个对象实例。
实现单例模式的思路是:
一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用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
|
public class Bank { private Bank() {} private static Bank instance = new Bank(); 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
|
public class Order { public Order() { }
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 { private Order2() { } private static Order instance = null;
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(){
if(instance == null){ synchronized (Bank.class) { if(instance == null){ instance = new Bank(); } } } return instance; } }
|
单例模式应用场景
- Windows的Task Manager就是很典型的单例模式;
- windows的Recycle Bin也是典型的单例应用;
- 网站的计数器如访客数,不蒜子计数器等。