单例设计模式的类型
根据实例化对象的时机单例设计模式又分为以下两种:
-
饿汉单例设计模式
-
懒汉单例设计模式
饿汉单例设计模式
饿汉单例设计模式就是使用类的时候已经将对象创建完毕,不管以后会不会使用到该实例化对象,先创建了再说。
看似很着急的样子,故被称为“饿汉模式”。
实现步骤:
将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
在该类内部产生一个唯一的实例化对象,并且将其封装为private static类型的成员变量。
定义一个静态方法返回这个唯一对象。
// 单例对象之饿汉式 public class User { // 1.将构造方法私有化。目的:外部无法通过new关键字创建出该类的实例对象 private User() { } // 2.在内部定义一个此类的实例对象,用private static修饰,private外部不能访问,static为了第3步的方法调用 private static User user = new User(); // 3.创建一个静态方法,返回该类的唯一实例对象,用public修饰,使外界可以得到该类的对象 public static User getInstance() { return user; } }
测试
public class Test { public static void main(String[] args) { User user1 = User.getInstance(); User user2 = User.getInstance(); System.out.println(user1); System.out.println(user2); System.out.println(user1 == user2); } }
懒汉单例设计模式
懒汉单例设计模式就是调用getInstance()方法时实例才被创建,先不急着实例化出对象,等要用的时候才实例化出对象。
看似不着急,故称为“懒汉模式”。
实现步骤:
将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
在该类内部产生一个唯一的实例化对象,并且将其封装为private static类型的成员变量。
定义一个静态方法返回这个唯一对象。要用的时候才实例化出对象
// 单例模式之懒汉式
public class Persion { // 1.构造方法私有化 private Persion() { } // 2.只声明一个对象,但是不创建(就是不new出来) private static Persion persion; // 3.创建一个静态方法,返回该类的唯一对象(只有在第一次使用时才创建对象),锁是为了高并发 public synchronized static Persion getInstance() { if (persion == null) { persion = new Persion(); } return persion; } }
测试
public class Test { public static void main(String[] args) { Persion persion1 = Persion.getInstance(); Persion persion2 = Persion.getInstance(); System.out.println(persion1); System.out.println(persion2); System.out.println(persion1 == persion2); } }
注意:懒汉单例设计模式在多线程环境下可能会实例化出多个对象,不能保证单例的状态,所以加上关键字:synchronized,保证其同步安全。
package com.hebi.test;
/**
* 懒汉式---第二个版本
*
*
* 2023-05-25 19:47
*/
public class MySingle3 {
private MySingle3(){
}
private static MySingle3 mySingle3;
// 双重检查锁定
// 只有第一个线程进来时,会使用锁,后面的线程进来不会使用锁,性能不会太低
public static MySingle3 getMySingle3(){
if (mySingle3==null) {
synchronized (MySingle3.class){
if (mySingle3==null) {
mySingle3=new MySingle3();
}
}
}
return mySingle3;
}
}
知识小结
单例模式可以保证系统中一个类只有一个对象实例。
实现单例模式的步骤:
-
将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
-
在该类内部产生一个唯一的实例化对象,并且将其封装为private static类型的成员变量。
-
定义一个静态方法返回这个唯一对象。
-
饿汉式:类加载时创建
-
懒汉式:第一次使用时创建
-