描述
单例(单个的实例),就是采用一定的方法保证在整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。单例模式又分为饿汉式和懒汉式两种方式。
实现步骤
(1)构造器私有化(private),防止类外通过new创建对象
(2)在类的内部创建对象
(3)向外暴露一个静态的公共方法用于获取该对象
饿汉式
样例代码:
package com.liuranli;
public class test {
public static void main(String[] args) {
Student stu = Student.GetStudent(); //获取学生对象
System.out.println(stu); //toString()
}
}
//饿汉式
class Student {
private String name; //普通的字符串属性 用于存储学生姓名
private static Student stu = new Student("小明"); //私有的静态的学生对象
//私有的构造方法,用于防止类外通过new创建对象
private Student(String name) {
this.name = name;
}
//公有的静态的返回该对象的方法
public static Student GetStudent() {
return stu;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
'}';
}
}
样例输出:
Student{name='小明'}
懒汉式
样例代码:
package com.liuranli;
public class test {
public static void main(String[] args) {
Teacher teacher = Teacher.GetTeacher(); //获取Teacher对象
System.out.println(teacher); //toString
}
}
//懒汉式
class Teacher {
private String name; //私有的用于存储教师姓名字符串属性
private static Teacher teacher; //私有的静态的用于存储教师对象的属性
private Teacher(String name) { //私有的构造器
this.name = name;
}
//公有的用于返回Teacher对象的方法
public static Teacher GetTeacher() {
//判断该对象是否已经存在,不存在则创建
if (teacher == null) teacher = new Teacher("小红");
return teacher;
}
@Override
public String toString() {
return "name:" + name;
}
}
样例输出:
name:小红
饿汉式VS懒汉式
(1)二者主要的区别在于创建对象的时机不同,饿汉式在类加载就创建了对象实例,而懒汉式在第一次使用时才创建。
(2)饿汉式不存在线程安全问题,懒汉式存在线程安全问题。
(3)饿汉式存在浪费资源的可能,因为如果程序一个对象实例都没有使用,那么饿汉式创建的对象就浪费了,懒汉式是使用时才创建,不存在这个问题。