# Singleton 单例模式

## 饿汉式

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

1. 将类的构造方法设置为 private
2. 创建一个静态的对象
3. 创建一个返回静态对象的函数

用代码表示如下:

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

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

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

}
```

## 懒汉式

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

```java
//懒汉式
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。

```java
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);

    }
}
```

输出结果如下:

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

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

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

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