单例模式:一个实例对象,指的是一个程序运行期间,某个类最多只可以创建一个对象—单例模式
1、构造方法私有化
2、定义私有、静态本类类型的成员属性
饿汉式:先创建对象
懒汉式:不先创建对象(至少是被动的)
3、饿汉式:由于已经创建对象,直接返回成员属性
懒汉式:要先判断成员属性是否为null,是创建对象,之后返回成员属性

import org.junit.Test;

import java.time.temporal.ValueRange;

/**
* @author: samxie
* @create: 2022/5/27
* @Description:
* @FileName: SingletonNewTest
* @History:
* @自定义内容:一个实例对象,指的是一个程序运行期间,
* 某个类最多只可以创建一个对象---单例模式
*/
public class SingletonNewTest {
@Test
public void test() {
//这种就是单例模式饿汉式的(那个人很饿,只要有东西可以就去吃),线程安全 先创建对象
Student student = Student.getInstance();
Student student1 = Student.getInstance();
System.out.println(student1 == student);
//true
}

//懒汉先不创建对象
@Test
public void test1() {
//这种就是单例模式懒汉的普通,线程不安全
Student1 student = Student1.getInstance();
Student1 student1 = Student1.getInstance();
System.out.println("===" + (student1 == student));
//true

}

//懒汉先不创建对象
@Test
public void test2() {
//这种就是单例模式懒汉的升级,线程不安全
LazyDoubleCheckSingleton student = LazyDoubleCheckSingleton.getInstance();
LazyDoubleCheckSingleton student1 = LazyDoubleCheckSingleton.getInstance();
System.out.println("===!!!!" + (student1 == student));
//true
}
}

class Student {
private Student() {

}

//先创建对象
private static Student stu = new Student();

public static Student getInstance() {
return stu;
}
}


class Student1 {
private Student1() {

}

//没有new对象
private static Student1 stu;

public static synchronized Student1 getInstance() {
if (stu == null) {
stu = new Student1();
}
return stu;
}
}

class LazyDoubleCheckSingleton {
private LazyDoubleCheckSingleton() {

}
private volatile static LazyDoubleCheckSingleton a;

//直接使用new就不能实现好的设计,这时候需要使用间接使用new, getInstance也是创建对象一种方法
//getInstance在主函数开始时调用,返回一个实例化对象,此对象是static
public static LazyDoubleCheckSingleton getInstance() {
if (null == a) {
synchronized (LazyDoubleCheckSingleton.class) {
if (null == a) {
a = new LazyDoubleCheckSingleton();
}
}
}
return a;
}
}