package com.model.danli;
import java.util.ArrayList;
/**
* @Description:测试类
* @Author: 张紫韩
* @Crete 2021/7/2 16:40
* 单例模式:饿汉式,懒汉式
*/
public class DanLiMoShiDemo01 {
public static void main(String[] args) {
GirlFriend girlFriend = GirlFriend.getGirlFriend();
GirlFriend girlFriend1 = GirlFriend.getGirlFriend();
System.out.println(girlFriend1 == girlFriend);
GirlFriend02 girlFriend02 = GirlFriend02.getGirlFriend02();
GirlFriend02 girlFriend03 = GirlFriend02.getGirlFriend02();
System.out.println(girlFriend03==girlFriend02);
}
}
//饿汉式
class GirlFriend{
private String name;
private int age;
/**
* 1.构造器私有化
* 2.在类的内部直接创建对象
* 3.提供一个公共的static的方法,返回类的对象
* 在类加载的时候创建单例模式对象
* */
private static GirlFriend girlFriend=new GirlFriend();
private GirlFriend() { }
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static GirlFriend getGirlFriend() {
return girlFriend;
}
@Override
public String toString() {
return "GirlFriend{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
class GirlFriend02{
/**
* 1.构造器私有化
* 2.定义一个static修斯的类对象
* 3.提供一个static修饰的public方法,返回这个类对象
* 4.提供的public方法,判断是否已经创建过对象,如果创建过就返回上次创建的类对象,从而保证单例模式
* */
private String name;
private int age;
private static volatile GirlFriend02 girlFriend02;
private GirlFriend02(){ }
public static GirlFriend02 getGirlFriend02(){
if (girlFriend02==null){
synchronized (GirlFriend02.class){
if (girlFriend02==null){
girlFriend02=new GirlFriend02();
}
}
}
return girlFriend02;
}
// 单例线程模式下可以,多线程时无法保证单例
// public static GirlFriend02 getGirlFriend02(){
// if (girlFriend02==null){
// girlFriend02=new GirlFriend02();
// }
// return girlFriend02;
// }
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "GirlFriend02{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}