← 返回首页
设计模式基础教程(十三)
发表时间:2021-08-22 11:07:37
单例模式

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;
}

单例模式适用的场景主要是系统只需要一个实例对象;客户调用类的单个实例只允许使用一个公共访问点。