Featured image of post 设计模式之单例模式

设计模式之单例模式

本文阅读量

设计模式:解决通用问题的架构

单例模式

是什么

确保一个类只有一个对象

饿汉式单例

获取对象时,对象早就创建好了

创建步骤

  1. 把类的构造器私有(private)
  2. 定义一个类变量记住类的一个对象
  3. 定义一个类方法,返回对象

把类构造器私有化

1
2
3
public class A {
  private A(){}
}

这样我们就无法通过new A()去创建无限制对象了,那问题来了,我们怎么创建一个对象呢?

定义一个静态变量记住类的一个对象

1
2
3
4
5
6
7
8
public class A{
  private A(){
    
  }
  
  // 
  public static A a = new A();
}

这时候我们就可以通过A a1 =A.a; 来获取对象了,因为是静态变量,所以不管我们创建几次,都只能获取一个对象了

但这样就安全了吗?不,当我们使用A.a = null,那不就把这个实例给销毁了吗?那怎么才能更安全呢?我们可以同时将这个静态变量也私有化呢?这样就来了以下代码

1
2
3
4
5
6
7
public class A{
  private A(){
    
  }
  
  private static A a = new A();
}

那这样又引出来了一个问题?那我们怎么获取这个实例呢?

定义一个类方法,返回对象

1
2
3
4
5
6
7
public class A{
  private static A a = new A();
  private A(){}
  public static A getInstance(){
    return a; 
  }
}

这样我们就可以使用A a1 = A.getInstance()来获取实例了

使用场景

单例对象频繁使用的时候,使用饿汉式单例

懒汉式单例

拿对象时,才开始创建对象

写法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public class B{
  private static B b; // 默认为null
  private B(){}
  public static B getInstance(){
    // 对象不存在的时候,我们需要去创建对象,在之后都返回这个对象
    if(b == null){
      b = new B();
    }
    return b; 
  }
}

使用场景

单例对象不频繁使用的时候,使用懒汉式单例

使用 Hugo 构建
主题 StackJimmy 设计