设计模式学习笔记(5)——单例模式

本人做的设计模式学习笔记系列的博文旨在用于个人学习之用,主要记载自己对设计模式的理解及代码的实现

单例模式(Singleton Pattern)

单例模式目的是确保一个类只有一个实例,只有类才能自己实例化自己,外部类无法对该类进行实例化。实现的关键在于生命私有构造函数和静态的私有实例。单例模式又可分为饿汉单例模式、懒汉单例模式和IoDH模式。饿汉单例类在类被加载时就自己进行实例化,确保实例的唯一性,但是比较占用资源。而懒汉模式则是在第一次使用时创建,不用一直占用系统资源,但要注意多线程处理的问题(可以使用双重检查锁定的方式)。IoDH(Initialization Demand Holder )技术则集懒汉和饿汉单例的优点。以下给出代码。

饿汉单例模式

public class HungryMan {
    //实例
    private static final HungryMan instance=new HungryMan();

    //私有构造函数
    private HungryMan() {}

    public static HungryMan getInstance() {
        return instance;
    }
}

懒汉单例模式(使用双重检查锁定确保实例的唯一性,Double-Check Locking)

public class LazyMan {
    private volatile static LazyMan instance=null;

    private LazyMan() {}

    public static LazyMan getInstace() {
        //第一重检查
        if(instance==null) {
            //锁定
            synchronized (LazyMan.class) {
                //第二重检查
                if(instance==null) {
                    instance=new LazyMan();
                }
            }
        }
        return instance;
    }
}

IoDH单例模式(在静态内部类中进行实例化)
IoDH.java:

public class IoDH {

    //静态内部类
    private static class Holder{
        private final static IoDH instance=new IoDH();
    }

    //私有构造函数
    private IoDH() {}

    //get函数
    public static IoDH getInstance() {
        return Holder.instance;
    }
}

SingletonPattern.java:

public class SingletonPattern {
    public static void main(String[] args) {
        //测试IoDH单例
        IoDH ioDH1,ioDH2;
        ioDH1=IoDH.getInstance();
        ioDH2=IoDH.getInstance();
        System.out.println(ioDH1==ioDH2);
    }
}

运行结果:

true

  IoDH的方法在第一次调用getInstance()函数时加载静态内部类Holder,首先初始化instance,从而保证了线程安全及实例的唯一性并实现了在“要用的时候”再实例化。

你可能感兴趣的:(设计模式)