两种简单的单例模式——饿汉式和懒汉式

一、单例模式

      单例模式是一种设计模式,它具有以下特征:

       1、单例类仅有一个实例;

       2、单例类自行实例化;

       3、向整个系统提供该实例。

二、饿汉式单例模式

public class EagerSingleton {
	private static EagerSingleton instance = new EagerSingleton();

	private EagerSingleton() {
	};

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

上例便实现了单例模式(饿汉式),它具有如下特征:

    1、构造方法私有,避免在其它类使用new关键字创建该类实例对象;

    2、自行创建实例对象,并将其私有;

    3、提供get方法获取该实例对象,该方法被public static修饰,可通过"类名.方法名"调用。

下面通过一段代码来进一步了解一下:

public class Test1 {
	public static void main(String[] args) {
		EagerSingleton es1 = EagerSingleton.getInstance();
		System.out.println("es1:" + es1);
		es1 = null;
		System.out.println("es1:" + es1);
		EagerSingleton es2 = EagerSingleton.getInstance();
		System.out.println("es2:" + es2);
	}
}

输出结果如下:

        从上面的输出结果可以看出,通过两次调用getInstance()方法获得的是同一个对象的地址值,并且对第一个对象赋null值,只是清除了其所存储的地址值,并不会对单例类的实例对象作出改变。

单例模式(饿汉式)的另一种表达方式:

public class EagerSingleton {
	public static final EagerSingleton instance = new EagerSingleton();

	private EagerSingleton() {
	};
}

 其特征是:

1、私有化构造方法;

2、提供一个实例对象,该实例对象被public static final修饰,public使外部类可访问该对象,static的作用是外部可通过“类名.变量名”访问该对象,final确保该对象不被修改。

二、懒汉式单例模式

public class LazySingleton {
	private static LazySingleton instance=null;

	private LazySingleton() {
	};
	
	synchronized public static LazySingleton getInstance(){
		if(instance==null){
			instance=new LazySingleton();
		}
		return instance;
	}
}

         从上面代码可以看出,懒汉式单例模式与饿汉式单例模式相比,懒汉式单例模式仅在getInstance()方法被调用时才会创建实例对象,而饿汉式单例模式在类加载时会自行创建实例对象。

        另外,需要注意的是,懒汉式单例模式需要对getInstance()方法进行同步化,以处理多线程环境。

猜你喜欢

转载自blog.csdn.net/LIAO_7053/article/details/81429227
今日推荐