
享元设计模式 和 享元设计模式在 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 ConcurrentMapcInstanceCache = 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. 参考文献
- 《图解设计模式》
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年05月14日 07时24分58秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
location.href表示当前访问的网址url
2025-04-11
location优先级别问题
2025-04-11
Lock 锁底层实现
2025-04-11
Lock和synchronized区别(以及Lock的使用)
2025-04-11
Lock锁精讲
2025-04-11
Locust性能测试 —— 环境搭建及使用
2025-04-11
lodash常用API
2025-04-11
Log4j 1使用教程
2025-04-11
Log4j XML 配置
2025-04-11
Log4j 日志级别
2025-04-11
Log4j 被曝核弹级漏洞,开发者炸锅了
2025-04-11
Log4j.xml和Log4j2.xml的简单认识 - log4j2/log4j的区别
2025-04-11
Log4j2 中format增加自定义的参数
2025-04-11
Log4j2 消停了,Logback 开始塌房了?
2025-04-11
Log4j使用总结
2025-04-11
Log4j使用配置总结
2025-04-11
log4j分离日志输出 自定义过滤 自定义日志文件
2025-04-11
Log4j日志级别
2025-04-11