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;
    }
}
 

 

posted @ 2022-03-03 16:12  柯南同学  阅读(123)  评论(0编辑  收藏  举报