单例设计模式:一个类只能自己创建自己的对象,同时确保只有单个对象被创建。此类提供了外部访问其唯一对象的方法,外部可以直接访问而不是通过new的方式去创建此类对象。
优点:1.只创建一次对象,减少内存开销,防止频繁的创建和销毁对象。
2.避免对资源多重占用(比如读写读写文件)
缺点:不能提供接口,不能被继承,违背单一职责原则。
以上内容借鉴地址:借鉴来源
懒汉式
私有化构造器,用于在本类中自己创建对象。将instance设置为静态,存储在静态存储区,每次调用时都指向同一个对象,同时也可被静态方法调用。定义为private,防止被外部类更改值(变为null就可以重新创建对象)
public class SluggardSingleton {
private static SluggardSingleton instance;
int num;
public void setNum(int num){this.num=num;}
public int getNum(){
return num;
}
private SluggardSingleton() {
}
public static SluggardSingleton getInstance() {
if (instance == null) {
synchronized (SluggardSingleton.class) {//锁不能用this当前对象,应该指定一个Class实例,因为此代码块在静态方法中
if (instance == null) {
instance = new SluggardSingleton();
}
}
}
return instance;
}
}
测试类
public static void main(String[] args) {
SluggardSingleton sl=SluggardSingleton.getInstance();
System.out.println("sl:"+sl.getNum());//0
SluggardSingleton sl2=SluggardSingleton.getInstance();
sl2.setNum(3);
System.out.println("sl2:"+sl2.getNum());//3
System.out.println("sl:"+sl.getNum());//3
}
SluggardSingleton.instance=null;
//若将SluggardSingleton中的 instance属性改为public,这里就可以将instance属性改为null,这样就没办法实现单例。
SluggardSingleton sl3=SluggardSingleton.getInstance();
System.out.println("sl3:"+sl3.getNum());//结果是0