崩溃の现充 发表于 2020-7-28 15:12

设计模式-单例模式

## 设计模式-单例模式

### 定义

单例模式(Singleton Pattern)属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象。这个类提供了一种访问其唯一的对象方式,可以直接访问,不需要实例化该类的对象

### 介绍

#### 注意
- 单例类只能有一个实例
- 单例类必须自己创建自己的唯一实例
- 单例类必须给所有其他对象提供这一实例

#### 意图
保证一个类仅有一个实例,并提供一个访问它的全局访问点

#### 主要解决
一个全局使用的类频繁地创建与销毁

#### 何时使用
当您想控制实例数目,节省系统资源的时候

#### 如何解决
判断系统是否已经有这个单例,如果有则返回,如果没有则创建

#### 关键代码
构造函数是私有的

### 实现方式

#### 非线程安全的懒汉式
1. 私有化一个类变量
2. 私有化构造方法
3. 判断是否为空,为空就 new ,不为空就直接返回.

```java
public class SluggardUnsafeSingleton {

    private static SluggardUnsafeSingleton sluggardUnsafeSingleton;

    private SluggardUnsafeSingleton() {
    }

    public static SluggardUnsafeSingleton getInstance(){
      if(sluggardUnsafeSingleton == null){
            sluggardUnsafeSingleton = new SluggardUnsafeSingleton();
      }
      return sluggardUnsafeSingleton;
    }

}
```

#### 线程安全的懒汉式
1. 私有化一个类变量
2. 私有化构造方法
3. 通过 synchronized 对方法进行枷锁。 判断是否为空,为空就 new ,不为空就直接返回.

```java
public class SluggardSafeSingleton {

    private static SluggardSafeSingleton sluggardSafeSingleton;

    private SluggardSafeSingleton() {
    }

    public static synchronized SluggardSafeSingleton getInstance(){
      if (sluggardSafeSingleton == null){
            sluggardSafeSingleton = new SluggardSafeSingleton();
      }
      return sluggardSafeSingleton;
    }

}

```

#### 饿汉式
1. 私有化一个类变量,并直接初始化
2. 私有化构造方法
3. 直接返回初始化的类变量

```java
public class HungrySingleton {

    private static final HungrySingleton hungrySingleton = new HungrySingleton();

    private HungrySingleton() {
    }

    public static HungrySingleton getInstance(){
      return hungrySingleton;
    }
}
```

#### 双重校验锁(DCL)
1. 使用 volatile 修饰类变量
2. 私有化构造方法
3. 先判断类变量是否为空,不为空直接返回。为空,则用 synchronized 进行加锁,然后实例化。

```java
public class DoubleCheckLockSingleton {

    private static byte[] lcok = new byte;

    private volatile static DoubleCheckLockSingleton singleton;

    private DoubleCheckLockSingleton() {
    }
    public static DoubleCheckLockSingleton getInstance(){
      if(singleton == null){
            synchronized (lcok){
                singleton = new DoubleCheckLockSingleton();
            }
      }
      return singleton;
    }
}

```

#### 静态内部类
1.在类里创建一个静态内部类
2. 静态内部类初始化一个外部类的变量,并用 static final 修饰
3. 外部类的方法可以直接返回,静态内部类的该变量

使用的是静态内部类的延迟加载

```java
public class InnerClassSingleton {

    private static class SinletonHolder{
      private static final InnerClassSingleton innerClass = new InnerClassSingleton();
    }

    private InnerClassSingleton() {
    }

    public static final InnerClassSingleton getInstance(){
      return SinletonHolder.innerClass;
    }

}
```

### 枚举
直接创建枚举,通过枚举类来实现
```java
public enumEnumSingleton {

    INSTANCE;
    public void whateverMethod(){

    }

}
```

Ldw 发表于 2020-7-28 19:29

感谢楼主分享
页: [1]
查看完整版本: 设计模式-单例模式