提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
什么是单例模式
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象化实例,并且该类只提供一个取得其对象实例的方法。
单例设计模式分为两类:饿汉式和懒汉式
一、饿汉式
1.1步骤:
- 构造器私有化
- 创建对象的过程在类的内部实现
- 向外暴露一个公共的静态方法 getInstance
- 代码实现
class Student{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//私有化构造器
private Student(String name) {
this.name = name;
}
//在类中创建实例化对象
private static Student ymy=new Student("ymy");
//向外暴露的公共静态方法
public static Student getInstance(){
return ymy;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
'}';
}
}
public class test01 {
public static void main(String[] args) {
Student instance = Student.getInstance();
System.out.println(instance);
Student instance2 = Student.getInstance();
System.out.println(instance2);
}
}
即使getInstance被调用了两次,但是获取到的仍然是同一个对象
1.2 注意
有时候只是需要用到该类中的其他静态成员而不需要用到实例对象ymy时,ymy对象也会被加载。就是说只要加载类就会创建ymy对象,所以这种方法叫饿汉式。
public class test01 {
public static void main(String[] args) {
System.out.println(Student.n1);
}
}
class Student{
private String name;
public static int n1=100;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//私有化构造器
private Student(String name) {
System.out.println("构造器被调用");
this.name = name;
}
//在类中创建实例化对象
private static Student ymy=new Student("ymy");
//向外暴露的公共静态方法
public static Student getInstance(){
return ymy;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
'}';
}
}
可以看到,只是用到该类的一个静态属性,而构造器也被调用了,所以饿汉式可能会造成资源浪费。
二、懒汉式
2.1 步骤
- 构造器私有化
- 声明一个该类的静态对象
- 提供一个public的静态方法getInstance,在方法中完成对象实例化
public class test01 {
public static void main(String[] args) {
Student instance = Student.getInstance();
}
}
class Student{
private String name;
//声明一个该类的静态对象
private static Student stu;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//私有化构造器
private Student(String name) {
this.name = name;
}
//提供一个public的静态方法getInstance,在方法中完成对象实例化
public static Student getInstance(){
if (stu==null)
stu=new Student("ymy");
return stu;
}
}
2.2注意
懒汉式可能存在线程安全的问题