设计模式学习(Java)——单例模式

时间:2023-02-26 15:19:36

其实我们在编程过程中往往都用到了一些设计模式,只是不知道他们还有具体的名称定义
翻阅了《设计模式之禅》后,觉得自己有必要系统地了解和学习一下程序设计的原则和一些常用的设计模式。
为了加深自己的理解,在此记录一下。


单例模式

  顾名思义,就是指某一个类在程序中只会有一个实例。

  为什么使用单例模式?

   (1)节省内存

        内存中始终只存在一个实例,避免了重复创建和丢弃实例造成的内存浪费

   (2)节省资源

       在进行IO操作的时候,通过创建一个入口防止资源的占用

   (3)统一信息

       也可以直接使用Static声明变量,单例或者Static可以确保某些变量全局统一

   如何实现单例模式

(1)饿汉模式

public class SingleExample{
//一个固定的不可更改的实例
private final static SingleExample instance=new SingleExample();
//将构造函数用Private限制,使得外部无法创建实例
private SingleExample(){
System.out.println("this is creating SingleExample");
}
//获取固定实例的方法(此方法返回的永远是同一个实例)
public static SingleExample getInstance(){
return instance;
}
public static void say(){
System.out.println("this is SingleExample is Saying ");
}
}

(2)懒汉模式

public class SingleExample{
//本类的一个实例变量
private static SingleExample instance=null;
//将构造函数设置成Private
private SingleExample(){
System.out.println("this is creating SingleExample" );
}
//获取实例,如果已经存在一个实例了,直接将其返回,没有则新建一个实例
public static SingleExample getInstance(){
if(instance==null){
instance=new SingleExample();
}
return instance;
}

public static void say(){
System.out.println("this is SingleExample is Saying ");
}

}


其中例子里的懒汉模式其实是线程不安全的,就是在高并发的多线程场景中可能会产生多个实例。

为什么?

  在多个线程中同时执行getInstance方法中判断语句时,当线程1判断得出instance=null并开始创建实例,同时在实例穿件成功前,线程2也进行了判断,而此时instance=null,线程2也会创建一个实例。

解决

  给getInstance()方法添加同步锁(synchronized