Java的单例模式

110 阅读2分钟

Java的单例模式

单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。

java的单例模式有两种实现方式:饿汉式、懒汉式。

一、饿汉式:

实现步骤:
    1. 构造器私有化 => 防止直接 new;
    2. 类的内部创建对象(该对象时static);
    3.向外暴露一个静态的公共方法;
缺点:可能会造成创建了对象,但是没有使用,造成了资源的浪费

代码实现:

public class SingleTon01 {
  public static void main(String[] args) {
    // Girlfriend jerry = new Girlfriend("jerry");
    Girlfriend instance1 = Girlfriend.getInstance();
    instance1.getName();

    Girlfriend instance2 = Girlfriend.getInstance();
    instance2.getName();

    System.out.println(instance1 == instance2); // 由此可知,instance1 和 instance2 是一个对象
  }
}

class Girlfriend{

  private String name;

  // 2.类的内部创建对象;
  private static Girlfriend gf = new Girlfriend("mary");

  // 1.将构造器私有化
  private Girlfriend(String name) {
    this.name = name;
  }

  // 3. 提供一个公共的static方法,返回 gf 对象
  public static Girlfriend getInstance() {
    return gf;
  }

  public void getName() {
    System.out.println("姓名:" + name);
  }
}

二、懒汉式:

   只有当用户使用getInstance时,才会创建对象。如果再次调用getInstance,他不会在创建对象,会将之前创建的对象返回;
  
  实现步骤:
    1. 构造器私有化 => 防止直接 new2. 定义一个静态属性,但是不new3.提供一个publicstatic方法,可以返回一个Cat对象;
  缺点:懒汉式存在线程安全问题;

代码实现:

public class SingleTen02 {
  public static void main(String[] args) {
    Cat cat1 = Cat.getInstance();
    System.out.println(cat1.getName());
    Cat cat2 = Cat.getInstance();
    System.out.println(cat2.getName());
    System.out.println(cat1 == cat2);
  }
}

// 希望在程序运行过程中,只能创建一个Cat对象
class Cat {
  private String name;

  // 2. 定义一个静态属性,但是不new
  private static Cat cat;

  // 1. 构造器私有化
  private Cat(String name) {
    this.name = name;
  }

  // 3. 提供一个public的static方法,可以返回一个Cat对象
  public static Cat getInstance() {
    if(cat == null){
      cat = new Cat("小灰灰");
    }
    return cat;
  }

  public String getName() {
    return name;
  }
}