1.单例模式
单例模式(Singleton Pattern):单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。
单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。单例模式是一种对象创建型模式。单例模式又名单件模式或单态模式。
在单例模式的实现过程中,需要注意如下三点: - 单例类的构造函数为私有; - 提供一个自身的静态私有成员变量; - 提供一个公有的静态工厂方法。
单例模式常见有懒汉模式和饿汉模式。
2.实例
懒汉模式 1)使用synchronized关键字保证同步,但是效率不高,每次都要加锁。
/*
* 懒汉模式
* */
public class LazySingletonDemo2 {
//提供一个自身的静态私有成员变量;用到了再实例化。
private static Object obj =null;
//构造方法私有
private LazySingletonDemo2(){
}
//使用synchronized关键字保证同步,但是效率不高,每次都要加锁。
public synchronized static Object getInstance(){
if(obj==null){
obj = new Object();
}
return obj;
}
}
2)通过加锁(Lock)实现同步。
import java.util.concurrent.locks.ReentrantLock;
/*
* 懒汉模式
* */
public class LazySingletonDemo3 {
//提供一个自身的静态私有成员变量;用到了再实例化。
private static Object obj = null;
private static ReentrantLock lock = new ReentrantLock();
//构造方法私有
private LazySingletonDemo3() {
}
//通过加锁实现。
public static Object getInstance() {
if (obj == null) {
lock.lock();
if (obj == null) {
obj = new Object();
}
lock.unlock();
}
return obj;
}
}
饿汉模式
/*
* 设计单例的原则:1.简洁。2.支持序列化。3.绝对单例。4.线程安全。Perfect!
*
*
* 单例模式:饿汉模式
*
* */
public class HungerSingletonDemo {
//不管是否用到都实例化一个单例对象。
private static Object obj = new Object();
private HungerSingletonDemo(){
}
public static Object getInstance(){
return obj;
}
}
也可以通过内部类实现单例,如下:
public class InnerClassSingletonDemo {
private static class SingletonHolder{
private static final Object obj = new Object();
}
private InnerClassSingletonDemo(){
}
public static final Object getInstance(){
return SingletonHolder.obj;
}
}
通过枚举实现的单例。
public enum EnumSingletonDemo {
INSTANCE;
}
单例模式适用的场景主要是系统只需要一个实例对象;客户调用类的单个实例只允许使用一个公共访问点。