单例设计模式的概述
单例模式,是一种常用的软件设计模式。通过单例模式可以保证系统中,应用该模式的这个类只有一个实例。即一个类只有一个对象实例。
单例设计模式实现步骤
- 将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
- 在该类内部产生一个唯一的实例化对象
- 定义一个静态方法返回这个唯一对象。
例设计模式的类型
根据实例化对象的时机单例设计模式又分为以下两种:
- 饿汉单例设计模式
- 懒汉单例设计模式
饿汉式单例设计模式
饿汉单例设计模式就是使用类的时候已经将对象创建完毕,不管以后会不会使用到该实例化对象,先创建了再说。很着急的样子,故被称为“饿汉模式”。
// 饿汉式单例设计模式:比较着急,不顾以后用不用该类的对象,先创建了再说
public class Person {
// 1.将构造方法私有化,防止外界直接通过new调用本类构造方法创建对象
private Person(){
}
// 2.在本类中创建该类的唯一对象
private static final Person p = new Person();
// 3.提供一个公共的静态方法用来获取该类的唯一对象
public static Person getInstance(){
return p;
}
// public static void method(){}
}
// 测试类
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();
System.out.println(p1);
System.out.println(p2);
System.out.println(p3);
System.out.println(p4);
}
}
输出
com.itheima.demo1_单例设计模式.饿汉设计模式.person@4554617c
com.itheima.demo1_单例设计模式.饿汉设计模式.person@4554617c
com.itheima.demo1_单例设计模式.饿汉设计模式.person@4554617c
com.itheima.demo1_单例设计模式.饿汉设计模式.person@4554617c
懒汉式单例设计模式
懒汉单例设计模式就是调用getInstance()方法时实例才被创建,先不急着实例化出对象,等要用的时候才实例化出对象。不着急,故称为“懒汉模式”。
代码
// 懒汉单例设计模式:就是调用getInstance()方法时才创建对象,先不急着创建对象,等要用的时候才创建对象。
public class Person {
// 1.将构造方法私有化,防止外界直接通过new调用构造方法创建对象
private Person(){
}
// 2.定义一个该类的成员变量,用来存储第一次创建的该类对象
private static Person p;
// 3.提供一个公共的静态方法获取该类的唯一对象
public static synchronized Person getInstance(){
// 第一次调用该方法的时候就创建该类的对象,后序调用该方法都是获取第一次调用时创建的该类对象
if (p == null){
// 问题:线程1,线程2都通过了判断,那2条线程都会new对象
// 解决:整个方法加锁
p = new Person();
}
return p;
}
// public static void method(){}
}
注意:懒汉单例设计模式在多线程环境下可能会实例化出多个对象,不能保证单例的状态,所以加上关键字:synchronized,保证其同步安全。
小结
单例模式可以保证系统中一个类只有一个对象实例。
实现单例模式的步骤:
- 将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
- 在该类内部产生一个唯一的实例化对象,并且将其封装为private static类型的成员变量。
- 定义一个静态方法返回这个唯一对象。