美文网首页
创建型模式:04-单例模式

创建型模式:04-单例模式

作者: 综合楼 | 来源:发表于2021-06-10 20:09 被阅读0次

1.饿汉模式

image.png

示例代码:

public class EagerLoadBalancer {
    private static final EagerLoadBalancer instance = new EagerLoadBalancer();

    private EagerLoadBalancer() {
    }

    public static EagerLoadBalancer getInstance(){
        return instance;
    }
}

2.懒汉模式(双重检查锁定模式)

image.png

示例代码:

public class LazyLoadBalancer {
    private volatile static LazyLoadBalancer instance = null;

    private LazyLoadBalancer() {
    }

    public static LazyLoadBalancer getInstance(){
        if (instance==null) {
            synchronized (LazyLoadBalancer.class) {
                if (instance==null) {
                    instance = new LazyLoadBalancer();
                }
            }
        }
        return instance;
    }

   /*这样不支持多线程。
    public static LazyLoadBalancer getInstance() {
        if (instance == null) {
            instance = new LazyLoadBalancer();
        }
        return instance;
    } */

    /*这样虽然解决了线程安全问题,
    但是每次调用getInstance()时都需要进行线程锁定判断,
    在多线程高并发访问环境中,将会导致系统性能大大降低。
    synchronized public static LazyLoadBalancer getInstance() {
        if (instance == null) {
            instance = new LazyLoadBalancer();
        }
        return instance;
    } */
}

3.Initialization Demand Holder (IoDH)

示例代码:

public class IoDHLoadBalancer {
    private IoDHLoadBalancer() {
        System.out.println("ss");
    }

    private static class HolderClass {
        private static final IoDHLoadBalancer instance = new IoDHLoadBalancer();
    }

    public static IoDHLoadBalancer getInstance(){
        return HolderClass.instance;
    }
    public static void main(String[] args) {
        System.out.println(IoDHLoadBalancer.getInstance()==IoDHLoadBalancer.getInstance());
    }
}

4.拓展练习

示例代码:

public class ExpandLoadBalancer {

    private volatile static List<ExpandLoadBalancer> instances = new ArrayList<>();

    private static final int MAX_INSTANCE = 3;

    private ExpandLoadBalancer() {
    }

    public static ExpandLoadBalancer getInstance(){

        if (instances.size()<MAX_INSTANCE) {
            synchronized (ExpandLoadBalancer.class) {
                if (instances.size()<MAX_INSTANCE) {
                    instances.add(new ExpandLoadBalancer());
                }
            }
        }
        return instances.get(new Random().nextInt(instances.size()));
    }
    public static void main(String[] args) {
        System.out.println(ExpandLoadBalancer.getInstance());
        System.out.println(ExpandLoadBalancer.getInstance());
        System.out.println(ExpandLoadBalancer.getInstance());
        System.out.println(ExpandLoadBalancer.getInstance());
        System.out.println(ExpandLoadBalancer.instances);
    }
}

5.问题

以上方法存在反射攻击或者反序列化攻击的可能。
最终解决方法:枚举单例

public enum Singleton {
    INSTANCE;
    public void doSomething() {
        System.out.println("doSomething");
    }
}

public class Main {
    public static void main(String[] args) {
        Singleton.INSTANCE.doSomething();
    }
}

相关文章

  • 单例模式

    单例 单例模式,是一种设计模式,属于创建型设计模式,还有一种创建型设计模式,工厂模式。设计模式总共有23种,三大类...

  • 开发之设计模式-单例模式

    设计模式 设计模式分为三大类:创建型、结构型、行为型在Java中有24中设计模式 创建型:单例 1、为什么用单例模...

  • 【设计模式】创建型设计模式汇总

    创建型设计模式汇总 1. 单例模式 1.1 单例模式的定义 一个类只允许创建一个对象或实例。 1.2 单例模式的作...

  • 23种设计模式学习总结

    创建型设计模式 主要解决对象的创建问题,封装复杂的创建过程,解耦对象的创建代码合使用代码。 单例模式 单例模式用来...

  • 2.架构设计(单例模式设计)

    1.设计模式分为三个类 创建型 结构型 行为型 2.创建型:单例模式 为什么用单例模式?如果你看到这个问题,你怎么...

  • Python 之单例模式

    简介:单例模式(Singleton Pattern) 是最简单的设计模式之一,属于创建型的设计模式。单例模式涉及到...

  • PHP常用设计模式

    # 创建型 单例模式 工厂模式 工厂抽象模式 原型模式 建造者模式 # 结构型 # 行为型 # 3.注册模式 # ...

  • 设计模式分类

    经典23种设计模式: 创建型设计模式: Singleton Pattern(单例模式) PrototypePatt...

  • PHP设计模式—创建型设计模式

    ** 创建型设计模式 **: 单例模式(Singleton Pattern) 工厂方法模式(Factor Patt...

  • S4. 单例模式

    单例模式(Singleton) 介绍 单例模式是创建型设计模式,即用于创建对象的设计。其能够保证当前系统仅存在一个...

网友评论

      本文标题:创建型模式:04-单例模式

      本文链接:https://www.haomeiwen.com/subject/hiqceltx.html