几种常用的设计模式--单例模式

169 阅读2分钟

一、单例实现方式

  • 饿汉式
  • 懒汉式
  • 懒汉式+Synchronized
  • 双重校验
  • 静态内部类
  • 枚举(推荐方式)

二、实现代码

  • 饿汉式

    package com.hanko.designpattern.singleton;

    /**

    • 饿汉式 (饿怕了,担心没有吃,所以在使用之前就new出来) *优点:实现简单,安全可靠 *缺点:在不需要时,就已实例化了

    • @author hanko

    • @version 1.0

    • @date 2020/9/14 18:50 */ public class HungrySingleton { //特点一 静态私有变量 直接初始化 private static HungrySingleton instance = new HungrySingleton(); //特点二 构造函数私有 private HungrySingleton(){

      } public static HungrySingleton getInstance(){ return instance; } public void doSomething(){ //具体需要实现的功能 } }

  • 懒汉式

    package com.hanko.designpattern.singleton;

    /**

    • 懒汉式(非常懒,所以在要使用时再去new) *优点:简单 *缺点:存在线程安全问题

    • @author hanko

    • @version 1.0

    • @date 2020/9/14 18:50 */ public class SluggardSingleton { //特点一 静态私有变量,先不初始化 private static SluggardSingleton instance; //特点二 构造函数私有 private SluggardSingleton(){

      } //特点三 null判断,没有实例化就new public static SluggardSingleton getInstance(){ if(instance == null){ instance = new SluggardSingleton(); } return instance; } public void doSomething(){ //具体需要实现的功能 }

    }

  • 懒汉式+Synchronized

    package com.hanko.designpattern.singleton;

    /**

    • 懒汉式(非常懒,所以在要使用时再去new) *优点:简单 *缺点:存在线程安全问题

    • @author hanko

    • @version 1.0

    • @date 2020/9/14 18:50 */ public class SluggardSingleton { //特点一 静态私有变量,先不初始化 private static SluggardSingleton instance; //特点二 构造函数私有 private SluggardSingleton(){

      } //特点三 null判断,没有实例化就new public static synchronized SluggardSingleton getInstance(){ if(instance == null){ instance = new SluggardSingleton(); } return instance; } public void doSomething(){ //具体需要实现的功能 }

    }

  • 双重校验

    package com.hanko.designpattern.singleton;

    /**

    • 双重校验 *对懒汉式单例模式做了线程安全处理增加锁机制

    • volatile变量级

    • synchronized 类级

    • @author hanko

    • @version 1.0

    • @date 2020/9/15 9:53 */ public class DoubleCheckSingleton { //特点一 静态私有变量,增加volatile变量级锁 private static volatile DoubleCheckSingleton instance; //特点二 构造函数私有 private DoubleCheckSingleton(){

      } //特点三 双重null判断 synchronized类级锁 public static DoubleCheckSingleton getInstance(){ if (instance == null){ synchronized(DoubleCheckSingleton.class){ if (instance == null){ instance = new DoubleCheckSingleton(); } } } return instance; } }

  • 静态内部类

    package com.hanko.designpattern.singleton;

    /**

    • 内部静态类方式 *优点:静态内部类不会在InnerStaticSingleton类加载时加载,

    • 而在调用getInstance()方法时才加载 *缺点:存在反射攻击或者反序列化攻击

    • @author hanko

    • @version 1.0

    • @date 2020/9/15 10:03 */ public class InnerStaticSingleton { //特点一:构造函数私有 private InnerStaticSingleton(){

      } //特点二:静态内部类 private static class InnerSingleton{ private static InnerSingleton instance = new InnerSingleton(); }

      public InnerSingleton getInstance(){ return InnerSingleton.instance; }

      public void doSomething(){ //do Something } }

  • 枚举(推荐方式)

    package com.hanko.designpattern.singleton;

    /**

    • 枚举实现单例简单安全
    • @author hanko
    • @version 1.0
    • @date 2020/9/14 19:01 */ public enum EnumSingleton { INS; private Singleton singleton; EnumSingleton() { singleton = new Singleton(); } public void doSomething(){ singleton... //具体需要实现的功能 }

    }

    EnumSingleton.INS.doSomething();

源代码

[hanko/design-pattern​

gitee.com

](link.zhihu.com/?target=htt…)