package com.hspedu.single_;
public class SingleTon02 {
public static void main(String[] args) {
// 单例模式 - 懒汉式
/*
* 饿汉式和懒汉式的区别:
* 饿汉式创建了,但不一定会使用;懒汉式只有使用了,才会去创建这个对象
* 二者创建对象的时机是不同的
* 饿汉式不存在线程安全问题,懒汉式会存在线程安全问题
* (如果有多个线程同时进入getInstance时,会出现创建多个实例,只是保留最后创建的对象)
* 饿汉式可能会造成资源浪费,懒汉式不存在这个问题
*
* */
// Cat cat = new Cat("大黄");
// 加载了这个类,但是没有创建对象
System.out.println(Cat.n1);
Cat instance = Cat.getInstance();
System.out.println(instance);
Cat instance2 = Cat.getInstance();
System.out.println(instance2);
System.out.println(instance == instance2);
// Runtime是经典的饿汉式的单例模式
}
}
class Cat {
private String name;
public static int n1 = 999;
private static Cat cat; // 默认是null,或者给定一个null
/*
* 1、构造器私有化
* 2、定义一个静态属性对象
* 3、提供一个public公共的static静态方法,返回一个CAT对象
*
* 只有当使用了getInstance才会返回一个对象,后面再次调用会返回之前的对象,保证单例
* */
private Cat(String name) {
System.out.println("Cat构造器被调用");
this.name = name;
}
public static Cat getInstance() {
if (cat == null) {
cat = new Cat("小可爱");
}
return cat;
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
'}';
}
}
package com.hspedu.singleton_;
public class SingleTonPattern {
public static void main(String[] args) {
// 练习懒汉式单例设计模式
/*
* 1、构造器私有化private
* 2、提供一个静态属性对象(与饿汉式不同此处为null)
* 3、提供一个静态方法返回这个对象
* */
System.out.println(Dog.legs);
Dog dog1 = Dog.getDog();
Dog dog2 = Dog.getDog();
Dog dog3 = Dog.getDog();
System.out.println(Dog.getDog().getName());
System.out.println(dog1.getName());
System.out.println(dog2 == dog3);
}
}
class Dog {
private String name;
private int age;
public static int legs = 4;
private static Dog dog = null;
private Dog(String name, int age) {
this.name = name;
this.age = age;
System.out.println("调用Dog类构造器创建了一只狗");
}
public static Dog getDog() {
if (dog == null) {
dog = new Dog("小白", 5);
}
return dog;
}
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;
}
}