【创建型模式】单例模式

方式7种
  • 饿汉式(静态变量)
    • 优势:
      1. 简单易写
      2. 线程安全
    • 劣势:浪费内存空间,只要类进行了加载,即使不使用对应的实例,也会进行加载
/**
 - 饿汉式 静态变量
 */
class MySingleton {
    private static MySingleton singleton = new MySingleton();

    private MySingleton() {
    }

    public static MySingleton getInstance() {
        return singleton;
    }
}
  • 饿汉式(静态代码块)
    • 优势:与静态变量差不错的意思
    • 劣势:缺点也和静态变量差不多
/**
 - 饿汉式 静态代码块
 */
class StaticBlockSingleton {
    private static StaticBlockSingleton singleton;

    static {
        singleton = new StaticBlockSingleton();
    }

    private StaticBlockSingleton() {
    }

    public static StaticBlockSingleton getInstance() {
        return singleton;
    }
}
  • 懒汉式(非线程安全)
    • 优势:在不需要使用实例的时候不会进行创建,不会浪费内存空间
    • 劣势:在多线程的情况下,可能产生不同的对象
    • 总结:不推荐使用
/**
 - 懒汉式 非线程安全
 */
class ThreadUnSafeSingleton {
    private static ThreadUnSafeSingleton singleton3;

    private ThreadUnSafeSingleton() {
    }

    public static ThreadUnSafeSingleton getInstance() {
        if (singleton3 == null) {
            singleton3 = new ThreadUnSafeSingleton();
        }
        return singleton3;
    }
}
  • 懒汉式(线程安全,效率低)
  • 优势:在多线程使用的情况下,线程安全了
  • 劣势:由于将锁关键字synchronized放在方法上,锁定范围较大,效率不高
  • 总结:不建议使用
/**
 - 懒汉式 线程安全
 */
class ThreadSafeSingleton {
    private static ThreadSafeSingleton singleton;

    private ThreadSafeSingleton() {
    }

    public static synchronized ThreadSafeSingleton getInstance() {
        if (singleton == null) {
            singleton = new ThreadSafeSingleton();
        }
        return singleton;
    }
}
  • 双检查(线程安全)
  • 优势:其实也是懒汉式的一种,线程安全,且缩小了锁的锁定范围,效率比懒汉式高一点(可忽略不及)
  • 劣势:不晓得
  • 总结:可以使用
/**
 - 双重检查
 */
class DoubleCheckSingleton {
    private static DoubleCheckSingleton singleton5;

    private DoubleCheckSingleton() {
    }

    public static DoubleCheckSingleton getInstance() {
        if (singleton5 == null) {
            synchronized (DoubleCheckSingleton.class) {
                if (singleton5 == null) {
                    singleton5 = new DoubleCheckSingleton();
                }
            }
        }
        return singleton5;
    }
}
  • 静态内部类
    • 优势:属于懒加载一种,外部类加载时不会加载内部类,所以在获取实例钱不会创建对象,节约了内存
    • 劣势:不晓得
    • 总结:推荐使用

/**
 * 静态内部类
 */
class StaticInnerClassSingleton {

    private StaticInnerClassSingleton() {
    }

    public static StaticInnerClassSingleton getInstance() {
        return InnerClass.singleton;

    }

    private static class InnerClass {
        private static StaticInnerClassSingleton singleton = new StaticInnerClassSingleton();
    }
}
  • 枚举
    • 优势:
      1. 高级,洋气,晓得的人相对比较小
      2. 线程安全
      3. 防止反序列化重新创建新的对象
    • 劣势:不晓得
/**
 * 枚举
 */
enum EnumSingleton {
    INSTANCE;
    String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值