当前位置: 主页 > JAVA语言

单例模式 java-为何使用单例模式的范式?(stateless)??

发布时间:2023-06-20 22:15   浏览次数:次   作者:佚名

为何使用单例模式

如果对象是无状态的(stateless),如一个函数单例模式 java,或者在设计上有内在的唯一性,我们倾向于使用单例模式来确保在应用范围内只有一个实例。单例模式也有其不好的一面,对测试来说如果不是基于接口(interface)可能不大方便,因为大部分的测试框架依赖于继承(inheritance)和多态(polymorphism)单例模式 java,单例模式难以继承,并且静态的方法对如mockito等框架难以注入假的(fake)对象。

单例模式的范式

单例模式 java_java 单例模式是什么_java单例模式 饿汉式

1. 通过公开唯一的字段暴露实例

单例模式 java_java 单例模式是什么_java单例模式 饿汉式

单例模式 java_java 单例模式是什么_java单例模式 饿汉式

使用这种方法的好处是:

2. 通过静态方法暴露实例

单例模式 java_java 单例模式是什么_java单例模式 饿汉式

java 单例模式是什么_java单例模式 饿汉式_单例模式 java

使用这种方法的好处是:

java 单例模式是什么_java单例模式 饿汉式_单例模式 java

注意第一和第二个方法,都没有办法阻止通过反射的形式新建出一个实例。

此外,如果要使用原生的java serialization机制,那么注意不仅仅是"implements Serializable"。还需要加上如下代码避免返回新的反序列化对象。

java单例模式 饿汉式_java 单例模式是什么_单例模式 java

java单例模式 饿汉式_单例模式 java_java 单例模式是什么

3. 通过Enum实现单例

单例模式 java_java 单例模式是什么_java单例模式 饿汉式

尽管看上去不太自然,但天然支持java 序列化(serialization)机制,确保了唯一实例的特性,很好地阻挡了基于反射破坏单实例的行为。当然,它也有缺点,无法继承一个非Enum的类。