java设计模式学习系列之一:单例模式(Singleton)
单例模式(Singleton)
??? 1.介绍:也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。??? 2.实现单例模式的思路是:一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称);当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用;同时我们还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。??? 3.注意事项:单例模式在多线程的应用场合下必须小心使用。如果当唯一实例尚未创建时,有两个线程同时调用创建方法,那么它们同时没有检测到唯一实例的存在,从而同时各自创建了一个实例,这样就有两个实例被构造出来,从而违反了单例模式中实例唯一的原则。 解决这个问题的办法是为指示类是否已经实例化的变量提供一个互斥锁(虽然这样会降低效率)。
??? 4.实现方式:通常单例模式在Java语言中,有两种构建方式:
?????? 饿汉方式:指全局的单例实例在类装载时构建。(一般认为这种方式要更加安全些)
?????? 懒汉方式:指全局的单例实例在第一次被使用时构建。?
?????? 5.示例:
????
//------------------------------------------------//
package org.qiujy.test;//方式一:饿汉式单例模式
public class Singleton1 {
?
?//构造方式设为private,外部不能访问
?private Singleton1() {
?}?// 在自己内部定义自己的一个private实例,只供内部调用
?private static final Singleton1 instance = new Singleton1();?// 提供了一个供外部访问本class的静态方法,可以直接访问
?public static Singleton1 getInstance() {
??return instance;
?}
}
//------------------------------------------------//package org.qiujy.test;//方式二:懒汉式单例模式
public class Singleton2 {
?
?private static Singleton2 instance = null;
?
?//这个synchronized很重要
?public static synchronized Singleton2 getInstance() {
??// 第一次使用时生成实例
??if (instance == null){
???instance = new Singleton2();
??}
??
??return instance;
?}
}
//------------------------------------------------//Google公司的工程师Bob Lee写的新的懒汉单例模式public class Singleton {????
???
? static class SingletonHolder {????
??? static Singleton instance = new Singleton();????
? }????
???
? public static Singleton getInstance() {????
??? return SingletonHolder.instance;????
? }????
???
}?
??
在加载singleton时并不加载它的内部类SingletonHolder,而在调用getInstance()时调用SingletonHolder时才加载SingletonHolder,从而调用singleton的构造函数,实例化singleton,从而达到lazy loading的效果。