一、单例模式——它是弥赛亚 它是The One


设计模式是面向问题、场景而总结产生的设计思路。是解决问题的套路。23 种经典的设计模式。它们又可以分为三大类:创建型、结构型、行为型。

创建型 包含了 单例模式、工厂模式、建造者模式、原型模式

单例模式

Singleton Design Pattern。一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。在实际应用中,配置文件比较适合单例模式,因为整套系统只有一个配置对象。

如果在系统中需要使用Log类,由于Log类对日志文件的操作方式需要保证线程安全,如果通过synchronized(Log.class)的方式来锁太麻烦,可以使用单例模式,只有一个Log对象,因此写文件的冲突由class对象的锁回到实例级别。

1. 饿汉方式

将instance提前创建,并要求其是final的,不允许被重指向。将构造方法私有化,不允许类外创建。(反射除外)

public class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton() {
    }

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

2. 懒汉方式

懒汉式相对于饿汉式的优势是支持延迟加载。一般使用双重检测(DCL)+ volatile 以提升多线程并发环境下的安全性。

public class Singleton {
    private volatile static Singleton instance;

    private Singleton() {
    }

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

3. 静态内部类

Singleton 类被装载了,instance 不一定被初始化。因为 SingletonHolder 类没有被主动使用,只有通过显式调用 getInstance 方法时,才会显式装载 SingletonHolder 类,从而实例化 instance。
因此,这种方式相比DCL方式显得更合理。

public class Singleton {
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    private Singleton() {
    }

    public static final Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

4. 枚举

这种方式应用的很少,但事实上是最佳实践方式。更简洁,自动支持序列化机制,绝对防止多次实例化。不仅能避免多线程同步问题,而且还自动支持序列化机制,防止反序列化重新创建新的对象,绝对防止多次实例化。


public class Singleton {
    //私有化构造函数
    private Singleton() {
    }

    //定义一个静态枚举类
    static enum SingletonEnum {
        //创建一个枚举对象,该对象天生为单例
        INSTANCE;
        private Singleton instance;

        //私有化枚举的构造函数
        private SingletonEnum() {
            instance = new Singleton();
        }

        public Singleton getInstance() {
            return instance;
        }
    }

    //对外暴露一个获取对象的静态方法
    public static Singleton getInstance() {
        return SingletonEnum.INSTANCE.getInstance();
    }
}
  • 多例模式,允许存在多个对象实例,但是不能超过预定数量。在类内部使用Map等容器来存储。

总结

单例模式能够支持创建全局唯一或者维N的对象,保证的资源访问的唯一性。在多种实现方式中,要注意饿汉式对初始化时间的影响,懒汉式对线程安全的考虑。

设计模式系列在github上有一个开源项目,主要是本系列博客的demo代码。https://github.com/forestnlp/designpattern
如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值