设计模式之单例模式

一、单例模式

详细介绍:

https://zhuanlan.zhihu.com/p/33102022

1.定义:确保一个类只有一个实例,并为整个系统提供一个全局访问点 (向整个系统提供这个实例)。

2.三要素:私有构造方法、指向自己实例的的私有静态引用、以自己实例为返回值的静态的公有方法。

3.优点

  • 在内存中只有一个对象,节省内存空间;

  • 避免频繁的创建销毁对象,可以提高性能;

  • 避免对共享资源的多重占用,简化访问;

  • 为整个系统提供一个全局访问点。

参考:https://monkeysayhi.github.io/2017/09/27/%E9%9D%A2%E8%AF%95%E4%B8%AD%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F%E6%9C%89%E5%87%A0%E7%A7%8D%E5%86%99%E6%B3%95%EF%BC%9F/

二、代码实现

1.懒汉式

 1 package DesignPattern;
 2 //懒汉式单例实现
 3 public class Singleton {
 4 //    定义一个变量来存储已经创建好的类实例
 5     private static Singleton uniqueInstance = null;
 6 //    私有化构造方法
 7     private Singleton(){
 8         System.out.print("懒汉单例");
 9     }
10 //    定义一个方法来为客户端提供类实例
11     public static synchronized Singleton getInstance(){
12         if(uniqueInstance==null){
13             uniqueInstance = new Singleton();
14         }
15         return uniqueInstance;
16     }
17 
18 }

2. 双重检测机制

package DesignPattern;

public class Singleton3 {
//    volatitle 防止指令重排序
    private volatile static Singleton3 instance = null;
    private Singleton3(){
        System.out.println("双重检测机制--单例");
    }
    public static Singleton3 getInstance(){
        if(instance==null){
            synchronized(Singleton3.class){
                if(instance==null){
                    instance = new Singleton3();
                }
            }
        }
        return instance;
    }

}

3.饿汉式

 1 package DesignPattern;
 2 //饿汉单例
 3 public class Singleton2 {
 4 //    定义一个变量来存储创建好的类实例,直接在这里创建类实例只能创建一次
 5     private static Singleton2 uniqueInstance = new Singleton2();
 6 //    私有化构造方法
 7     private Singleton2(){
 8         System.out.print("饿汉单例");
 9     }
10 //    定义一个方法来为客户端提供类实例
11 //    构造方法被私有化了,外部创建不了类实例就没有办法调用这个对象的方法,就实现不了功能调用
12 //    单例模式决定让这个类提供一个方法来返回类的实例
13 //    在方法上加上static,这样就可以直接通过类来调用这个方法,而不需要先得到实例
14     public static Singleton2 getInstance(){
15         return uniqueInstance;
16     }
17 }

 4.调用

1 package DesignPattern;
2 
3 public class main {
4     public static void main(String[] args) {
5         Singleton.getInstance();
6         Singleton2.getInstance();
      
Singleton3.getInstance();

7 } 8 }

 5.Holder模式(静态内部类)

 1 package DesignPattern;
 2 
 3 public class Singleton4 {
 4     private static class SingletonHolder{
 5         private static Singleton4 instance = new Singleton4();
 6         private SingletonHolder(){}
 7     }
 8     private Singleton4(){
 9         System.out.println("静态内部类");
10     }
11     public static Singleton4 getInstance(){
12         return SingletonHolder.instance;
13     }
14 }

 三、总结

实现方式关键点资源浪费线程安全多线程环境的性能足够优化
基础饱汉 懒加载 -
饱汉变种1 懒加载、同步
饱汉变种2 懒加载、DCL -
饱汉变种3 懒加载、DCL、volatile
饿汉 静态变量初始化
Holder 静态变量初始化、holder
枚举 枚举本质、静态变量初始化
原文地址:https://www.cnblogs.com/jingpeng77/p/12956638.html