单例模式有两种
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;
}
}