单例设计模式

package com.study;

public class Study {
    public static void main(String[] args) {
        GirFriend girFriend01 = GirFriend.getInstance();
        GirFriend girFriend02 = GirFriend.getInstance();
        //注意此处不是new对象,是直接调用静态方法,把结果赋给对象
        System.out.println(girFriend01);
        System.out.println(girFriend02);
        System.out.println(girFriend01 == girFriend02);//是同一个对象(静态)

        System.out.println(Cat.len);//9
        Cat instance01 = Cat.getInstance();
        System.out.println(instance01);
        //再次调用
        Cat instance02 = Cat.getInstance();
        System.out.println(instance02);
        System.out.println(instance01 == instance02);


    }
}

/*
    单例模式:饿汉式(只要类加载对象就创建了)
    1.私有化构造器(添加private不让外部new)
    2.在内部创建对象(添加static)
    3.提供一个公共的static方法,返回friend对象
    4.浪费资源
 */
class GirFriend{
    private String name;

    //GirFriend friend = new GirFriend("xh");
    private static GirFriend friend = new GirFriend("xh");
    //这里直接创建好了静态对象,会随着类加载而加载
    //此处好像可以不加private

    //添加static是因为需要被静态方法调用(静态只能调静态)

    private GirFriend(String name){//私有化构造器,加private是不让外面new
        System.out.println("构造器GirFriend被调用...");
        this.name = name;
    }

    //创建这个方法的目的是为了不用创建对象也可以调用此方法
    public static GirFriend getInstance(){//getInstance获取实例
        return friend;
    }

    @Override
    public String toString() {
        return "GirFriend{" +
                "name='" + name + '\'' +
                '}';
    }
}

/*
    单例模式:懒汉式(对象在使用时创建)
    1.私有化构造器(添加private不让外部new)
    2.定义一个静态属性对象
    3.提供一个public static方法,可以返回一个Cat对象
    4.只有当用户调用getInstance(),才返回cat对象,后面再次调用时会返回上次创建的对象,从而保证了单例
    5.存在线程安全问题

    希望在程序创建中只创建一个Cat对象,使用单例模式
 */
class Cat{
    private String name;
    public static int len = 9;//这里创建静态属性len,测试类加载发现cat对象并没有创建
    private static Cat cat;//cat对象没有赋值默认为null

    private Cat(String name) {
        System.out.println("构造器Cat被调用...");
        this.name = name;
    }

    public static Cat getInstance(){//此处存在线程安全问题,需要加锁
        if (cat == null){//如果没用创建cat对象则直接创建
            cat = new Cat("wy");
        }
        return cat;
    }

    @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + '\'' +
                '}';
    }
}

  

上一篇:实验二 常用命令


下一篇:Python 正则表达式-语义化正则