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
以上,希望能帮助学习单例模式的小伙伴。