java 之 单例模式(大话设计模式)

笔者记得去面试时曾被问起这个模式,当时还没有看过设计模式,对设计模式基本上一无所知,不过可以肯定的是笔者用过单例模式。当时回答的风马牛不相及,很尴尬。

也是从那时起,开始学习设计模式。今天所说的就是单例模式,有很多时候,我们希望类只能实例化一次。例如我们经常使用的Method等就是最典型的单例模式。当然很多框架中也是有单例模式。

先看下类图:

大话设计模式-类图

单例模式分为懒汉式和饿汉式。先看下笔者的demo。

/**
 * 饿汉式
 */
public class SingleDemo {

    private static SingleDemo singleDemo = new SingleDemo();

    private SingleDemo() {

    }

    public static SingleDemo getInstance() {
        return singleDemo;
    }
}
/**
 * 懒汉式
 */
public class SingleDemo2 {

    private static SingleDemo2 singleDemo2 = null;

    private SingleDemo2() {

    }

    public static SingleDemo2 getInstance() {
        if (null == singleDemo2) {
            synchronized (SingleDemo2.class) {
                if (null == singleDemo2) {
                    return singleDemo2 = new SingleDemo2();
                }
            }
        }
        return singleDemo2;
    }
}
/**
 * 内部类 懒汉式
 */
public class SingleDemo3 {

    private SingleDemo3() {

    }

    private static class SingleHold {
        private static SingleDemo3 singleDemo3 = new SingleDemo3();
    }

    public static SingleDemo3 getInstance() {
        return SingleHold.singleDemo3;
    }
}
/**
 * 客户端
 */
public class Test {

    public static void main(String[] args) {

        SingleDemo singleDemo = SingleDemo.getInstance();
        SingleDemo singleDemo1 = SingleDemo.getInstance();
        System.out.println(singleDemo == singleDemo1);

        SingleDemo2 singleDemo2 = SingleDemo2.getInstance();
        SingleDemo2 singleDemo21 = SingleDemo2.getInstance();
        System.out.println(singleDemo2 == singleDemo21);

        SingleDemo3 singleDemo3 = SingleDemo3.getInstance();
        SingleDemo3 singleDemo31 = SingleDemo3.getInstance();
        System.out.println(singleDemo3 == singleDemo31);
    }
}

运行结果:

true
true
true

这三者笔者推荐大家使用内部类形式,三者的区别网上很多,笔者偷下懒给大家一个地址:http://www.cnblogs.com/coffee/archive/2011/12/05/inside-java-singleton.html

以上,希望能帮助学习单例模式的小伙伴。

原文地址:https://www.cnblogs.com/zhuxiansheng/p/8043634.html