Java设计模式之单例模式(恶汉式和懒汉式)

/*
 * 单例模式:
 *         饿汉式:类一加载就创建对象
 *         懒汉式:用的时候,才去创建对象
 * 面试题:单例模式的思想是什么?写一个代码体现(我们最好写懒汉式的单例模式给面试官,这个才是他想要的答案)
 *         开发使用:恶汉式(是不会出问题的单例模式)
 *         面试时写懒汉式(可能会出现问题的单例模式)
 *             A:懒汉式(延迟加载)
 *             B:线程安全问题
 *                 a:是否多线程环境   是
 *                 b:是否有共享数据  是
 *                 c:是否有多条语句操作共享数据  是

 */


单例模式的一般步骤:

1、私有化构造方法使其外部不能直接创建对象保证对象的唯一性

2、私有化和静态化自己内部的对象(因为外部不能new对象只能内部来new了)

3、提供一个公共的静态的方法给外部直接使用自己内部创建的对象


 单例模式之恶汉式源代码:

package 创建型_单例模式_饿汉式;
/*
 * 单例模式之恶汉式:类一加载就创建对象
 */
public class Student {
	//构造方法私有为了保证外部不能new对象,确保唯一性(单例)
	private Student(){
		
	}
	//外部不能new对象,只能自己内部new一个student对象了
	//这个要static化,因为下面要提供一个static方法对外界直接访问,而static方法只能访问static成员
	//而且为了外部不能修改这个对象为null(Student.student=null,没意义),所以这个对象也要private
	 private static Student student = new Student();
	
	//提供公共的访问方式,内部new的对象为了外部使用许提供一个public方法获取对象实例
	//但是注意因为外部不能new对象,则不能通过对象名.方法获取Student类的内部实例,所有要把这个公共方法静态化statis
	//static化之后因为static方法不能直接方法普通成员方法,只能访问静态成员,所以要将new的对象static话
	public static Student getStudent(){
		return student;
	}

}

package 创建型_单例模式_饿汉式;

/*
 * 單例模式:保证类在内存中只有一个对象
 * 
 * 如何保证泪在内存中只有一个对象呢?
 * 	A:把构造方法私有化
 * 	B:在成员位置自己创建一个对象
 * 	C:通过一个公共的方法提供访问
 */

public class StudentMain {
	public static void main(String[] args) {
//		Student student = new Student();
//		Student student2 = new Student();
//		System.out.println(s1==s2);//false;
		
		//通过单例如何得到对象呢?
		
//		Student.student=null;//这个说明外部把内部的成员修改了,所以内部的成员要private话
		Student student = Student.getStudent();
		Student student2 = Student.getStudent();
		System.out.println(student==student2);
		
		System.out.println(student);
		System.out.println(student2);
	}

}

 单例模式之懒汉式源代码:

package 创建型_单例模式_懒汉式;

/*
 * 单例模式:
 * 		饿汉式:类一加载就创建对象
 * 		懒汉式:用的时候,才去创建对象
 * 面试题:单例模式的思想是什么?倾斜一个代码体现
 * 		开发使用:恶汉式(是不会出问题的单例模式)
 * 		面试时写懒汉式(可能会出现问题的单例模式)
 * 			A:懒汉式(延迟加载)
 * 			B:线程安全问题
 * 				a:是否多线程环境   是
 * 				b:是否有共享数据  是
 * 				c:是否有多条语句操作共享数据  是
 */
public class Teacher {

	//私有构造方法
	private Teacher(){
		
	}
	//私有  static Teacher类对象的引用teacher  需要的时候才new对象,初值为null
	private static Teacher teacher = null;
	
	public synchronized static Teacher getTeacher(){
		//t1  t2  t3
		if(teacher==null){//t1判断为空进去new一个对象,然后轮到t2进去,又new一个对象出来。。。。所以线程不安全,在面试的时候就要加上synchronized同步操作
			//t1  t2  t3
			teacher = new Teacher();
		}
		return teacher;
	}
}
package 创建型_单例模式_懒汉式;

public class TeacherMain {
	public static void main(String[] args) {
		
		Teacher teacher = Teacher.getTeacher();
		Teacher teacher2 = Teacher.getTeacher();
		System.out.println(teacher==teacher2);
		
		System.out.println(teacher.toString());
		System.out.println(teacher2);
		
		//output:
		/*
		 *  true
			创建型_单例模式_懒汉式.Teacher@15db9742
			创建型_单例模式_懒汉式.Teacher@15db9742
		*/
	
	}

}




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