单例模式:确保一个类只有一个实例,而且自行实例化并向整个系统提供实例,这个类称为单例类,它提供全局访问的方法。
单例模式的要点:
(1)某个类只有一个实例。
(2)它必须自行创建这个实例。
(3)它必须自行向整个系统提供这个实例。
常见的单例模式的创建方法:
1、饿汉式单例模式
package singlepattern;
/*
* 单例模式
* 饿汉单例模式
*/
public class Singleton_hungery {
/*
* 在定义静态变量的时候实例化单例类,
* 在类加载时候,就已经创建了对象
*/
private static Singleton_hungery instance=new Singleton_hungery();
/*
* 构造函数私有,避免外界利用构造函数创建出
* 任意多的类。
*/
private Singleton_hungery() {}
public static Singleton_hungery getInstance() {
return instance;
}
}
2.懒汉式单例模式
package singlepattern;
/*
* 懒汉单例模式
*/
public class Singleton_lazy {
//懒汉单例模式在加载时不会被实例化。
private static Singleton_lazy instance=null;
//懒汉单例模式的构造方法被私有化,防止内部类被访问。
private Singleton_lazy() {}
/*
* 懒汉单例模式,在多线程的情况下,可能会出错,
* 因此,使用synchronized关键字,将这一段代码块锁起来。
* 由于该实例的对象为空,可利用反射机制传入类对象
*/
public static Singleton_lazy getInstance() {
if(instance==null) {
synchronized (Singleton_lazy.class) {
instance=new Singleton_lazy();
}
}
return instance;
}
}
3、静态内部类
package singlepattern;
/*
* 利用静态内部类构造单例模式
*/
public class Singleton {
private Singleton() {}
private static class SingletonHolder{
private final static Singleton instance=new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
测试类:
package singlepattern;
public class Test {
public static void main(String[] args) {
Singleton_hungery sh1=Singleton_hungery.getInstance();
Singleton_hungery sh2=Singleton_hungery.getInstance();
System.out.println(sh1==sh2);
Singleton_lazy sl1=Singleton_lazy.getInstance();
Singleton_lazy sl2=Singleton_lazy.getInstance();
System.out.println(sl1==sl2);
Singleton s1=Singleton.getInstance();
Singleton s2=Singleton.getInstance();
System.out.println(s1==s2);
}
}