Java中的两种单例模式

单例模式有两种
1.饿汉单例模式
2.懒汉单例模式

1.饿汉单例模式

public class Singleton {
    public static void main(String[] args) {
        ControlPanel c1 = ControlPanel.controlPanel;
        ControlPanel c2 = ControlPanel.controlPanel;
        System.out.println(c1);//com.study.singleleton.ControlPanel@4eec7777
        System.out.println(c2);//com.study.singleleton.ControlPanel@4eec7777
        //他们结果都是一样的
        //在对c1赋值时,ControlPanel这个类已经通过那个静态成员变量将对象创建出来了,并存放了对象的地址,而且静态成员变量只会加载一次
        c1.setEquipment("Huawei p50");
        System.out.println(c1.getEquipment());
        System.out.println(c2.getEquipment());//结果也是一样的
    }
}



public class ControlPanel {
    //有的时候,只需要创建一个实例
    //所有单例模式第一步都是创建私有构造器
    private String equipment;
    public static ControlPanel controlPanel = new ControlPanel();//用静态成员变量将对象创建出来//因为静态成员方法在类中只会加载一次
    private ControlPanel() {

    }
    //然后就要想个办法适当暴露创建对象
    //饿汉单例是要提前将这个对象创建好,当主方法类中需要的时候已经提前创建好了
    public String getEquipment(){
        return this.equipment;
    }

    public void setEquipment(String equipment) {
        this.equipment = equipment;
    }
}

2.懒汉单例模式

public class Singleton {

    public static void main(String[] args) {
        //ControlPanel c1 = ControlPanel.controlPanel;
        //ControlPanel c2 = ControlPanel.controlPanel;//现在都是null了,在懒汉模式里我们不希望别人直接访问这个静态成员,
        //因为被访问也就可以给它赋值,如果第一次用getInstance创建了对象,然后又将这个静态成员变量的值值赋为null,它又能创建成员变量了
        //所以要将静态成员变量私有化
        ControlPanel c3 = ControlPanel.getInstance();
        c3.setEquipment("xiaomi 12");
        System.out.println(c3.getEquipment());
        ControlPanel c4 = ControlPanel.getInstance();
        System.out.println(c4.getEquipment());//结果是一样的

    }
}


public class ControlPanel {
    //有的时候,只需要创建一个实例
    //所有单例模式第一步都是创建私有构造器
    private String equipment;
    private static ControlPanel controlPanel ;
    private ControlPanel() {

    }
    //然后就要想个办法适当暴露创建对象
    //懒汉单例是要用的时候再把它创建好
    public static ControlPanel getInstance(){
        if(controlPanel==null){//如果controlPanel的值为空,说明还是默认的值,等会要通过这个判断是否创建对象,并将对象的值赋给controlPanel
            controlPanel = new ControlPanel();
        }
        return controlPanel;
    }
    public String getEquipment(){
        return this.equipment;
    }

    public void setEquipment(String equipment) {
        this.equipment = equipment;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值