• 设计模式之单例模式


    一、单例模式

    详细介绍:

    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
    枚举 枚举本质、静态变量初始化
  • 相关阅读:
    【交换】
    【数字对】
    【改造二叉树】
    【Begin】
    100以内所有质数的输出
    位运算符、|和||、&和&&的区别
    linux中vim编辑器三种模式及常用命令的使用
    静态代码块、构造代码块和构造函数的执行顺序
    字符乱码出现的原因及解决办法
    Springcloud-微服务
  • 原文地址:https://www.cnblogs.com/jingpeng77/p/12956638.html
Copyright © 2020-2023  润新知