享元设计模式 和 享元设计模式在 FastDateFormat类中的应用
发布日期:2021-05-08 17:19:56 浏览次数:19 分类:精选文章

本文共 2101 字,大约阅读时间需要 7 分钟。

享元设计模式:通过共享实例优化性能

1. 享元设计模式概述

享元设计模式(Flyweight Pattern)是一种优化软件性能的设计模式,其核心思想是通过共享实例来避免频繁创建实例,从而减少内存占用和时间开销。

在这个模式中,主要涉及两个角色:共享实例和负责获取或创建这些共享实例的工厂。这种设计模式特别适用于那些需要频繁创建和销毁实例,但又不希望每个实例独立存在的场景。

一个典型的例子是字符串常量池(String Pool)。当我们需要创建字符串常量时,首先会检查常量池中是否已经存在该字符串。如果存在,就直接使用;如果不存在,就创建一个并将其存储在常量池中。需要注意的是,字符串常量池中的实例通常是不可变的,一旦被修改,会导致共享使用时的逻辑错误。

2. 享元设计模式在 FastDateFormat 类中的应用

FastDateFormat 是 Apache Commons Lang 工具包(org.apache.commons.lang3.time)中的一个类,主要用于日期格式化。它同时扮演工厂角色和共享实例的角色。

FastDateFormat 类内部维护了一个并发缓存(ConcurrentMap)的池(cInstanceCache),其键是由日期格式、时区和地区组成的多部分键,值是 FastDateFormat 实例。每次调用 getInstance 方法时,会根据提供的参数生成唯一的键,用于从缓存中获取或创建共享实例。

getInstance 方法实现
public F getInstance(final String pattern, TimeZone timeZone, Locale locale) {
Validate.notNull(pattern, "pattern must not be null");
if (timeZone == null) {
timeZone = TimeZone.getDefault();
}
if (locale == null) {
locale = Locale.getDefault();
}
final MultipartKey key = new MultipartKey(pattern, timeZone, locale);
final F format = cInstanceCache.get(key);
if (format == null) {
final F previousValue = cInstanceCache.putIfAbsent(key, format);
if (previousValue != null) {
format = previousValue;
}
}
return format;
}
池的实现

FastDateFormat 类的池由以下代码实现:

private final ConcurrentMap
cInstanceCache = new ConcurrentHashMap<>(7);
MultipartKey 类

MultipartKey 类用于生成唯一的键,键由日期格式、时区和地区组成。它的 equals 和 hashCode 方法确保了键的唯一性和比较的准确性。

private static class MultipartKey {
private final Object[] keys;
private int hashCode;
MultipartKey(final Object... keys) {
this.keys = keys;
}
@Override
public boolean equals(final Object obj) {
return Arrays.equals(keys, ((MultipartKey)obj).keys);
}
@Override
public int hashCode() {
if (hashCode == 0) {
int rc = 0;
for (final Object key : keys) {
if (key != null) {
rc = rc * 7 + key.hashCode();
}
}
hashCode = rc;
}
return hashCode;
}
}

3. 参考文献

  • 《图解设计模式》
上一篇:(八)在vue中使用better-scroll,实现内容区域的滚动效果,以及右边与左边内容相对应,左边呈现高亮状态
下一篇:(七)在Vue中获取DOM对象

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2025年05月14日 07时24分58秒