设计模式学习--单例模式

概念

创建单一实例,保证类在程序中只有一个实例。

需要做到

  • 构造方法私有 (+ private修饰符)
  • 在类中创建对象(为了类的内部调用需要+static修饰;为了防止外部通过类名调用需要+private)
  • 给外部提供公共的访问方法(为了外界能获取到此方法,需要+static修饰)

饿汉式单例模式

一句话:类加载的时候对象已经创建好了

public class Student {
	private Student() {}
	private static Student student = new Student();
	public static Student getStudent(){
		return student;
	}
	public void say(){
		System.out.println("我叫A学生");
	}
}

懒汉式单例模式

一句话:什么时候要对象,就什么时候创建对象

public class Student {
	private Student() {}
	private static Student student=null;
	public synchronized static Student getStudent(){
		if(student == null){
			student = new Student();
		}
		return student;
	}
	public void say(){
		System.out.println("我叫A学生");
	}
}

推荐使用的是饿汉式单例模式

分析:
  • 懒汉式单例模式的问题:
1. 线程安全问题怎么产生的?(多线程访问getStudent时可能某个进程获取到的对象为null)
2. 线程安全问题怎么解决的?(+关键字synchronized)

案例

学生类
package design03;

/**
 * 这是一个学生类
 * @author wangtengfei-ds
 *
 */
public class Student {
	/**
	 * 私有化构造方法,不允许外界创建此类的对象
	 */
	private Student() {
		
	}
	
	/**
	 * 在类的内部创建类的对象
	 */
	private static Student student = new Student();
	
	/**
	 * 为外界提供获取类的对象的方法
	 * @return student对象
	 */
	public static Student getStudent(){
		return student;
	}
	
	/**
	 * 提供一个对象的方法案例
	 */
	public void say(){
		System.out.println("我叫A学生");
	}
}

测试学生类
package design03;

/**
 * 单例模式测试小程序
 * @author wangtengfei-ds
 *
 */
public class StudentTest {
	public static void main(String[] args) {
		Student s1 = Student.getStudent();
		Student s2 = Student.getStudent();
		System.out.println(s1==s2);//true
		s1.say();
		s2.say();
	}
}
posted @ 2016-09-13 11:52  Take-off.Wang  阅读(520)  评论(0编辑  收藏  举报