Skip to content
On this page

设计模式

✍️

更新中

单例模式

采取一定方法,确保某类整个软件系统中只有一个对象实例,且只有一种方法取得生成的实例。

饿汉式

步骤

  1. 将构造器设为私有(无法 new
  2. 类内部创建实例
  3. 使用静态公共方法暴露实例
java
public class SingleInstance01 {
    public static void main(String[] args) {
        GirlFriend.getGirlFriend();
    }
}

class GirlFriend{
    private String name;
    private int age;

    private static GirlFriend girlFriend = new GirlFriend("lapp",21);// 随着类的加载初始化,且只会执行一次

    private GirlFriend(String name,int age){
        System.out.println(name+"我老婆");
        this.age = age;
        this.name = name;
    }

    // 静态方法,不用创建对象调用方法
    public static GirlFriend getGirlFriend(){
        // GirlFriend girlFriend = new GirlFriend("lapp",21); 这样做无法保证生成唯一一个实例
        return girlFriend;
    }
}

懒汉式

创建了对象但是没有用会造成资源浪费。单例模式中的懒汉式解决了这一问题,使用到实例才会创建。

更改:

java
class GirlFriend{
    private String name;
    private int age;

    private static GirlFriend girlFriend;

    private GirlFriend(String name,int age){
        System.out.println(name+"我老婆");
        this.age = age;
        this.name = name;
    }

    // 静态方法,不用创建对象调用方法
    public static GirlFriend getGirlFriend(){
        if( girlFriend== null{
            girlFriend = new GirlFriend("lapp",21);
        }
        return girlFriend;
    }
}

只有调用 getGirlFriend()方法的时候才会创建实例。再次调用时返回第一次调用的 GirlFriend 对象,不会重新生成。

对比

  • 饿汉与懒汉的不同在于创建对象的时机不同

    饿汉模式在类加载时就创建了对象,懒汉模式在用户使用的时候才会创建

  • 饿汉式不存在线程安全问题,懒汉式存在线程安全风险,可能创建多个对象

  • 饿汉式可能造成空间的浪费

  • JavaSE 标准类中,java.lang.Runtime 是经典的单例模式