2018.2.17 设计模式中的单例模式下的懒汉式和饿汉式的区别

设计模式中的懒汉式和饿汉式的区别

总结一下,两种方案的构造函数和公用方法都是静态的(static),实例和公用方法又都是私有的(private)。但是饿汉式每次调用的时候不用做创建,直接返回已经创建好的实例。这样虽然节省了时间,但是却占用了空间,实例本身为static的,会一直在内存中带着。懒汉式则是判断,在用的时候才加载,会影响程序的速度。最关键的是,在并发的情况下,懒汉式是不安全的。如果两个线程,我们称它们为线程1和线程2,在同一时间调用getInstance()方法,如果线程1先进入if块,然后线程2进行控制,那么就会有两个实例被创建。

懒汉式

package com.glut.demo6;

public class MySingleton {
	//设立静态变量
	private static MySingleton mySingleton = null;
	
	//私有化构造函数
	private MySingleton() {
		System.out.println("懒汉式单例模式开始调用构造函数");
	}
	

	//开放一个共有方法,判断是否已经存在实例,又返回,没有就创建
	public static MySingleton getInstance() {
		if(mySingleton == null) {
			System.out.println("懒汉式构造函数的实例当前并没有被创建");
			mySingleton = new MySingleton();
		}else {
			System.out.println("懒汉式构造函数的实例已经被创建");
		}
		System.out.println("方法调用结束,返回单例");
		return mySingleton;
	}
}



package com.glut.demo6;

/**
 * 懒汉式单例模式
 * @author qichunlin
 *
 */
public class Client {
	public static void myprint() {
		System.out.println("懒汉式单例模式");
		System.out.println("第一次取得实例");
		MySingleton s1 = MySingleton.getInstance();
		
		System.out.println("第二次取得实例");
		MySingleton s2 = MySingleton.getInstance();
		
		if(s1 ==s2) {
			System.out.println("两个实例相同");
		}
		System.out.println();
	}
	
	public static void main(String[] args) {
		//懒汉式
		myprint();
	}
}

饿汉式

package com.glut.demo5;

/**
 * 创建一个Singleton类
 * 饿汉式
 * 
 * 饿汉式的特点是一开始就加载了,如果说懒汉式是“时间换空间”,那么饿汉式
 * 就是“空间换时间”,因为一开始就创建了实例,所以每次用到的之后直接返回就好了
 * 
 * @author qichunlin
 *
 */
public class SingleObject {
	//创建SingleObject的一个对象,直接创建实例
	private static SingleObject instance = new SingleObject();
	
	//让构造函数为private,这样该类就不会被实例化了
	private SingleObject() {
		super();
	}
	
	//获得唯一可用对象
	public static SingleObject getInstance() {
		return instance;
	}
	
	//显示信息
	public void showMessage() {
		System.out.println("Hello World!");
	}
}


package com.glut.demo5;

/**
 * 单例模式 从 singleton 类获取唯一的对象。
 * 
 * @author qichunlin
 *
 */
public class Test {
	public static void main(String[] args) {

		// 不合法的构造函数
		// 编译时错误:构造函数 SingleObject() 是不可见的
		// SingleObject object = new SingleObject();

		// 获取唯一可用的对象
		SingleObject object = SingleObject.getInstance();
		// 显示信息
		object.showMessage();
	}
}

posted @ 2018-02-17 23:07  LegendQi  阅读(234)  评论(0编辑  收藏  举报