Java基础-单例设计模式之懒汉式
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; } }