Singleton 单例模式

单例模式,也就是一个类只能实例化成一个对象。对于需要频繁创建,销毁的对象可以使用单例模式。单例模式 有两种实现方式 : 懒汉式 和 饿汉式

饿汉式

饿汉式在创建类的时候直接创建一个实例, 具体过程如下:

  1. 将类的构造方法设置为 private

  2. 创建一个静态的对象

  3. 创建一个返回静态对象的函数

用代码表示如下:

//饿汉式
public class Singleton1 {
    //1.创建私有构造
    private Singleton1() {

    }
    //2.创建该类型的私有静态实例
    private static Singleton1 instance=new Singleton1();

    //3.创建静态方法返回静态实例对象
    public static Singleton1 getInstance() {
        return instance;
    }

}

懒汉式

创建类的时候实例化一个null对象。每一次尝试实例化的时候查询一下实例化是否为null,若不为null,创建一个静态对象,反之返回静态对象。 具体代码如下:

//懒汉式
public class Singleton2 {
    //1.创建私有构造
    private Singleton2() { }

    //2.创建类的时候实例化一个null
    private static Singleton2 instance=null;

    //3.设置一个获取实例化的函数
    public static Singleton2  getInstance() {
        if(instance==null) {
            instance= new Singleton2();
        }
        return instance;
    }
}

最后我们编写了一个测试类 SingletonTest。

public class SingletonTest {
    public static void main(String[] args) {
        //私有化构造函数无法访问
        //Singleton1 one=new Singleton1();

        //只能通过共有的静态方法直接获取一个静态实例
        Singleton1 one=Singleton1.getInstance();
        Singleton1 two=Singleton1.getInstance();
        System.out.println(one);
        System.out.println(two);

        System.out.println("\n=============================================\n");

        Singleton2 one1=Singleton2.getInstance();
        Singleton2 two1=Singleton2.getInstance();
        System.out.println(one1);
        System.out.println(two1);

    }
}

输出结果如下:

indi.chester.singleton.Singleton1@1540e19d
indi.chester.singleton.Singleton1@1540e19d

=============================================

indi.chester.singleton.Singleton2@677327b6
indi.chester.singleton.Singleton2@677327b6

可以看出我们尝试创建两个对象,但最终返回的都是同一个对象。

Last updated