单例设计模式之饿汉式和懒汉式

一、单例设计模式

主要思想:
简而言之就是该类在内存中只能存在一个实例化对象,也就是说其他类不能创建该类的实例化对象。

二、饿汉式单例设计模式

实例化对象随着类的加载而加载,即使该对象未被使用也会被创建
代码实现:

public class eagerSingleDesignTest {	
	//构造私有
	private eagerSingleDesignTest() {}
	//创建私有静态实例化对象
	private static eagerSingleDesignTest asdTest=new eagerSingleDesignTest();
	//创建静态方法获取实例化对象
	public static eagerSingleDesignTest getEagerSingleDesignTest() {
		return asdTest;
	}
}

三、懒汉式单例设计模式

只有当需要实例化对象的时候才会去创建
代码实现(线程不安全):

public class lazySingleDesignTest {
	//私有构造
	private lazySingleDesignTest() {}
	//创建对象
	private static lazySingleDesignTest lsdTest=null;
	//静态方法获取对象
	public static lazySingleDesignTest getlLazySingleDesignTest() {
		//判断对象是否已经存在
		if(lsdTest==null) {
			lsdTest=new lazySingleDesignTest();
		}
		return lsdTest;
		
	}
}

线程安全(同步方法实现):

public class lazySingleDesignTest {
	//私有构造
	private lazySingleDesignTest() {}
	//创建对象
	private static lazySingleDesignTest lsdTest=null;
	//静态方法获取对象,同步方法保证线程安全
	public static synchronized lazySingleDesignTest getlLazySingleDesignTest() {
		//判断对象是否已经存在
		if(lsdTest==null) {
			lsdTest=new lazySingleDesignTest();
		}
		return lsdTest;
	}
}

线程安全(同步代码块实现):

public class lazySingleDesignTest {
	//私有构造
	private lazySingleDesignTest() {}
	//创建对象
	private static lazySingleDesignTest lsdTest=null;
	//静态方法获取对象
	public static lazySingleDesignTest getlLazySingleDesignTest() {
		//外面嵌套一个if判断可以提高代码的效率,当lsdTest不为空的时候直接就返回lsdTest了
		if(lsdTest==null){
		//同步代码块保证线程安全
			synchronized(lazySingleDesignTest.class){
				//判断对象是否已经存在
				if(lsdTest==null) {
					lsdTest=new lazySingleDesignTest();
				}
			}
		}
		return lsdTest;
	}
}

四、总结

单例模式的懒汉式和饿汉式实现就是这样啦,相比较下饿汉式在开发中的使用较多,但是懒汉式又有可能在面试中被问到,懒汉式的实现涉及到了线程安全问题,所以这两种实现方式我们都要会。

你可能感兴趣的:(设计模式,设计模式,java)