首页 > 其他 > 详细

单利模式小试

时间:2014-03-23 15:17:41      阅读:433      评论:0      收藏:0      [点我收藏+]

《研磨设计模式》中的定义:保证一个类仅有一个实例,并提供它的一个全局访问点。

而单例模式的本质便是——控制实例数目。

1、单例模式是比较简单的模式,传统的有懒汉式和饿汉式两种。

懒汉式如下:

bubuko.com,布布扣
package singleton;

public class Singleton1 {

    private static Singleton1 instance = null;

    private Singleton1() {
    }

    public static Singleton1 getInstance() {
        if (instance == null) {
            instance = new Singleton1();
        }
        return instance;
    }
}
bubuko.com,布布扣

顾名思义,懒汉式便是类加载时并不创建该单例对象实例,等到类使用时才去创建。

2、饿汉式如下:

bubuko.com,布布扣
package singleton;

public class Singleton2 {

    private static Singleton2 instance = new Singleton2();

    private Singleton2() {
    }

    public static Singleton2 getInstance() {
        return instance;
    }
}
bubuko.com,布布扣

饿汉式便是类加载时便创建实例了,故每次使用时无需创建。

懒汉式、饿汉式就是Spring中的BeanFactory和ApplicationContext在处理单例类时的区别。

3、由于懒汉式单例模式并非线程安全的,想要保证线程安全,除了在创建实例的方法上加Synchronized之外,最简单的当然是,在创建对象的时候,每一步多进行一次判断,判断该对象是否已经存在。

然而,《研磨设计模式》中介绍了Java中一种一优雅的,能保证线程安全的懒汉式单例模式,叫做Lazy initialization holder class模式。如下:

bubuko.com,布布扣
package singleton;

public class Singleton3 {

    private Singleton3() {
    }

    private static class SingletonHolder {
        private static Singleton3 instance = new Singleton3();
    }

    public Singleton3 getInstance() {
        return SingletonHolder.instance;
    }
}
bubuko.com,布布扣

类的静态内部类,实际上是一个顶层类,可以不依赖外围类的实例而存在,就像是类的一个静态成员变量。只有在使用时,其内部的变量才会被实例化。Lazy initialization holder class模式便是利用JVM自身的特性保证了线程安全。

单利模式小试,布布扣,bubuko.com

单利模式小试

原文:http://www.cnblogs.com/zrtqsk/p/3618616.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!