概念
创建单一实例,保证类在程序中只有一个实例。
需要做到
- 构造方法私有 (+ 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();
}
}