Java 单例模式

  

 

饿汉式:

  1. 构造器私有化 => 防止直接new
  2. 类内部创建对象赋予static变量
  3. 向外暴露static公共方法,返回类实例变量

 

package com;

public class Singleton {
  private String name;
  public static int n = 22;
  private static Singleton singleton = new Singleton("singleton");

  private Singleton(String name) {
    System.out.println("constructor was called");
    this.name = name;
  }

  public static Singleton getInstance() {
    return singleton;
  }

  @Override
  public String toString() {
    return "Singleton{" +
        "name='" + name + '\'' +
        '}';
  }
}

  

package com;

import org.jetbrains.annotations.NotNull;


public class Test {
  public static void main(String @NotNull [] args) {
    Singleton s1 = Singleton.getInstance();
    Singleton s2 = Singleton.getInstance();
    System.out.println(s1==s2);
    System.out.println(s1);
    System.out.println(s2);
  }
}

  

 

懒汉式

  1. 构造器私有化
  2. 定义static类属性保存实例
  3. 提供public static方法返回static类属性保存的实例
  4. 只有当用户使用getInstance时,才返回构造实例,再次调用,返回之前创建的实例

package com;

public class Singleton {
  private String name;
  public static int n = 33;
  private static Singleton singleton;  // default null

  private Singleton(String name) {
    System.out.println("constructor was called");
    this.name = name;
  }

  @Override
  public String toString() {
    return "Singleton{" +
        "name='" + name + '\'' +
        '}';
  }

  public static Singleton getInstance(String name) {
    if (singleton == null) {
      singleton = new Singleton(name);
    }
    return singleton;
  }
}

  

package com;

import org.jetbrains.annotations.NotNull;


public class Test {
  public static void main(String @NotNull [] args) {
    System.out.println(Singleton.n);
//    Singleton s1 = Singleton.getInstance("s1");
//    Singleton s2 = Singleton.getInstance("s2");
//    System.out.println(s1==s2);
//    System.out.println(s1);
//    System.out.println(s2);
  }
}

 

 

二者区别:
1: 创建时机不同,饿汉式类加载时就创建了对象实例,懒汉式getInstance时才创建
2: 饿汉式不存在线程安全问题,懒汉式存在线程安全问题
3: 饿汉式存在浪费资源的可能,懒汉式使用时才创建
4: javaSE标准类中,java.lang.Runtime就是单例模式

 

posted @ 2021-07-06 14:06  ascertain  阅读(234)  评论(0编辑  收藏  举报