设计模式是面向问题、场景而总结产生的设计思路。是解决问题的套路。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、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。