正常情况下,一个类可以创建多个对象
public class Person {
public Person(){}
public static final Person p = new Person();
public static Person getInstance(){
return p;
}
}
public class Test {
public static void main (String[] args) {
Person p1 = new Person();
Person p2 = new Person();
Person p3 = new Person();
Person p4 = new Person();
Person p5 = new Person();
}
}
有时候,某些类【Person】,我们希望只能创建单一的一个对象,这个时候就需要使用单例模式
单例模式:
概述:是一种常用的软件设计模式
通过单例模式可以保证系统中,应用该模式的这个类只有一个实例,也就是该类仅有一个对象实例
步骤:
1.将构造方法私有化,让其不能在类的外部通过new的方式实例化该类对象
2.在该类内部产生一个唯一的实例对象
3.定义一个静态方法返回这个唯一的对象
public class Person {
//1.将构造方法私有化,让其不能在类的外部通过new的方式实例化该类对象
private Person(){}
//2.在该类内部产生一个唯一的实例对象
private static final Person p = new Person();
//3.定义一个静态方法返回这个唯一的对象
public static Person getInstance(){
return p;
}
}
public class Test {
public static void main (String[] args) {
Person p1 = Person.getInstance();
Person p2 = Person.getInstance();
Person p3 = Person.getInstance();
Person p4 = Person.getInstance();
Person p5 = Person.getInstance();
}
}
单例模式(饿汉模式、懒汉模式)
根据实例化对象的【时机】,单例模式又分为两种设计模式
【饿汉模式】和【懒汉模式】
【饿汉模式】
我们当前这种Person类的设计模式属于饿汉单例模式
饿汉单例模式就是在使用类的时候已经将对象创建完毕
不管以后会不会使用到该实例对象
我先创建了再说
看起来很着急的样子,所以称之为【饿汉模式】
上面的例子就是饿汉模式
【懒汉模式】
Student类设计成【懒汉式】单例模式
懒汉单例模式,就是在调用getInstance方法的时候
实例才会被创建,不着急实例化对象
等到需要用的时候才实例化对象
因为它不着急,用到时候才创建,故称之为【懒汉式】单例模式
public class Student {
// 1.将构造方法私有化,让其不能在类的外部通过new的方式实例化该类对象
private Student(){}
// 2.在该类内部产生唯一的实例对象
private static Student s;//默认值就是null
// 3.定义一个静态方法返回这个唯一的对象
public static synchronized Student getInstance(){
//创建Student唯一的对象
//判断一下,如果s这个成员变量为null的化,就创建,不为null,就不创建
if(s == null){
s = new Student();
}
return s;
}
}
public class Test {
public static void main (String[] args) {
Student s1 = Student.getInstance();
Student s2 = Student.getInstance();
}
}
这里需要注意的一个问题:
因为懒汉单例模式在调用方法时才会创建对象
所以当有多个地方同一个时间调用该方法获取对象的化
意思就是说在多线程情况下可能会出现实例化多个对象出来
为了保证单例的状态,需要加上一把锁,使其能够保证同步运行