今天工作不太忙,回顾看到了设计模式的单例模式,很经典,记录了一下,我之前面试也是经常被问到,初学者可以重点记忆。
单例模式
单例模式通常是指采取一定的方法来保证我们整个系统中,这个类只能存在一个对象实例,并且该类只提供一个可以取得对象实例的方法。
底下是单例模式的两个经典简单案例(饿汉式/懒汉式)
package com.yxb.security.demo.service.serviceImpl;
public class ScannerTest {
/**
* @Description:
* @author : loong
* @Date: 2024-08-23
*/
public static void main(String[] args) {
/*单例模式的特点就是提供唯一一个访问点,就是我们定义的静态方法*/
Chiese instance = Chiese.getInstance();
System.out.println(instance);
}
}
/*饿汉式,类加载的时候,我们就进行实例化*/
class Chiese {
/*1.想要创建单例模式,首先要防止外部调用,这里我们直接私有化类的构造器*/
private Chiese() {
}
/*2.这里我们已经私有化构造器了,所以想要创建当前类的实例只能从内部实例化*/
private static Chiese nice = new Chiese();
/*3.这里我们提供一个供外部调用的方法,因为需要供外部调用,所以方法要加个static,而静态属性只能调静态变量,所以我们实例化的地方也需要进行static修饰*/
public static Chiese getInstance() {
/*4.方法里,我们只提供一个被实例化的对象,无论调多少此这个方法,该对象也只是获得已有的被实例化的对象,而不是获得一个新的实例化对象*/
return nice;
}
}
/*懒汉式,类加载的时候不进行实例化,当我们调用方法的时候在进行实例化,可以减少一部分的内存资源消耗,但是可能出现线程安全问题*/
class Chiese2 {
/*想要创建单例模式,首先要防止外部调用,这里我们直接私有化类的构造器*/
private Chiese2() {
}
/*这里我们已经私有化构造器了,所以想要创建当前类的实例只能从内部实例化*/
private static Chiese2 nice = null;
/*这里我们提供一个供外部调用的方法,因为需要供外部调用,所以方法要加个static,而静态属性只能调静态变量,所以我们实例化的地方也需要进行static修饰*/
public static Chiese2 getInstance() {
if (nice == null){
nice = new Chiese2();
}
return nice;
}
}
切记一下重点:
1.单例模式的出现就是为了确保我们一个类只有一个实例,并且会提供一个入口(静态方法才可以被外部调用)。
2.饿汉式和懒汉式的区别就是,饿汉式在类加载的时候就直接进行实例化,而懒汉式就是我们需要的时候通过调用方法才进行实例化,可以减少的内存资源占用时间。
3.饿汉式的安全性高一点,使用懒汉式切记要加锁,切记!切记!切记!后续复习到锁那一块在重新走一变懒汉式做回顾。