首页 > 其他分享 >享元设计模式 和 享元设计模式在 FastDateFormat类中的应用

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

时间:2023-12-28 11:31:56浏览次数:32  
标签:享元 keys FastDateFormat hashCode key 设计模式 final


1. 概述

享元设计模式(Flyweight Pattern):通过尽量共享实例来避免new出实例。

享元设计模式中有两个角色,一是要共享的实例,二是获取或创建这些共享实例的工厂。

举一个例子:例如 String 常量池,大家创建的String常量,创建String的时候,先去常量池中看一下,有该String常量直接使用该常量,如果没有就去创建,创建成功后放在常量池中,当然这些常量不允许修改的,享元模式中的共享的实例也不允许修改,一旦被修改,大家在共用的时候就会出现问题。

享元设计模式 和 享元设计模式在 FastDateFormat类中的应用_常量池

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

这里的FastDateFormat指的是 apache 工具包(org.apache.commons.lang3.time)里面的一个类。

FastDateFormat 类既充当工厂角色,也充当共享的对象,pool是一个Map,key 是 getInstance 方法的参数,value 是 FastDateFormat实例,参数是日期的格式,例:yyyy-MM-dd。

享元设计模式 和 享元设计模式在 FastDateFormat类中的应用_常量池_02


先看下 getInstance 方法,该方法第一步使用参数生成 key,使用 key 去获取 共享的 FastDateFormat 对象,无已经创建的 FastDateFormat 共享对象则创建。

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();
        }
        // 使用参数生成 key
        final MultipartKey key = new MultipartKey(pattern, timeZone, locale);
        // 使用 key 去获取 共享的 FastDateFormat 对象
        F format = cInstanceCache.get(key);
        // 无已经创建的 FastDateFormat 共享对象则创建
        if (format == null) {
            format = createInstance(pattern, timeZone, locale);
            final F previousValue= cInstanceCache.putIfAbsent(key, format);
            if (previousValue != null) {
                // another thread snuck in and did the same work
                // we should return the instance that is in ConcurrentMap
                format= previousValue;
            }
        }
        return format;
    }

pool 如下所示

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

key 如下所示, key 是使用 getInstance 方法参数通过计算(下面代码中的hashCode方法)得来:

private static class MultipartKey {
        private final Object[] keys;
        private int hashCode;

        /**
         * Constructs an instance of <code>MultipartKey</code> to hold the specified objects.
         * @param keys the set of objects that make up the key.  Each key may be null.
         */
        MultipartKey(final Object... keys) {
            this.keys = keys;
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public boolean equals(final Object obj) {
            // Eliminate the usual boilerplate because
            // this inner static class is only used in a generic ConcurrentHashMap
            // which will not compare against other Object types
            return Arrays.equals(keys, ((MultipartKey)obj).keys);
        }

        /**
         * {@inheritDoc}
         */
        @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;
        }
    }

参考文献

  • 图解设计模式 结成浩
  • 图解设计模式 尚硅谷


标签:享元,keys,FastDateFormat,hashCode,key,设计模式,final
From: https://blog.51cto.com/xuxiangyang/9012042

相关文章

  • GOF23--23种设计模式(三)
    一.桥接模式Java中的桥接模式(BridgePattern)是一种结构性设计模式,它将抽象部分和实现部分分离,使它们可以独立变化,同时通过桥接对象将它们连接起来。这种模式将抽象与其实现解耦,使得抽象和实现可以独立变化。抽象和它的实现通过一个桥接类进行连接,使得它们可以各自独立地变化。......
  • Composite 组合模式简介与 C# 示例【结构型3】【设计模式来了_8】
    Composite组合模式简介与C#示例【结构型3】【设计模式来了_8】 阅读目录〇、简介1、什么是组合设计模式?2、优缺点和适用场景一、简单的代码示例二、根据示例代码看结构三、相关模式回到顶部〇、简介1、什么是组合设计模式?一句话解释:  针对树形结构......
  • Facade 外观模式简介与 C# 示例【结构型5】【设计模式来了_10】
    Facade外观模式简介与C#示例【结构型5】【设计模式来了_10】 阅读目录〇、简介1、什么是外观模式?2、外观模式的优缺点和适用场景一、外观模式的代码实现二、结构三、相关模式回到顶部〇、简介1、什么是外观模式?一句话解释:  将一系列需要一起进行的......
  • Builder 生成器模式简介与 C# 示例【创建型2】【设计模式来了_2】
    Builder生成器模式简介与C#示例【创建型2】【设计模式来了_2】 阅读目录〇、简介1、什么是生成器模式?2、优缺点和使用场景一、简单的示例代码二、生成器模式结构三、在.Net框架中的实际应用四、相关模式回到顶部〇、简介1、什么是生成器模式?一句话......
  • Decorator 装饰者模式简介与 C# 示例【结构型4】【设计模式来了_9】
    Decorator装饰者模式简介与C#示例【结构型4】【设计模式来了_9】 阅读目录〇、简介1、什么是装饰者模式2、优缺点和适用场景一、通过示例代码简单实现二、装饰者模式的结构三、相关模式回到顶部〇、简介1、什么是装饰者模式一句话解释:  通过继承统......
  • Java 工厂方法设计模式
    需求:Pizza有以下几个方法prepare()准备食材bake()烘焙cut()切割box()装盒现在有2种披萨且和2地区有关,成都地区第一种是CDApplePizza,第二种是CDCheesePizza。北京地区的BJApplePizza和BJApplePizza。PizzaStore有点单系统Order(city,pizzaType)根据pizzatype去制作对......
  • flutter常用的设计模式
    单例模式(SingletonPattern):确保一个类只有一个实例,并提供一个全局访问点。工厂模式(FactoryPattern):定义一个创建对象的接口,但让子类决定具体实例化哪个类;常用于创建组件、复杂对象等场景。抽象工厂模式(AbstractFactoryPattern):提供一个创建一系列相关或相互依赖对象的接口,而......
  • JAVA 设计模式(一) - 单例模式
    JAVA设计模式(一)-单例模式本篇文章主要讲下android创建型设计模式中的单例模式.单例模式保证一个类只有一个实例,并提供一个访问该实例的全局节点.它的实现有多种实现方式:1:饿汉式饿汉式:类加载时就创建实例.不支持延迟加载实例publicclassSingleton{priva......
  • JAVA设计模式(三)-原型
    JAVA设计模式(三)-原型本篇文章主要讲下java创建型设计模式中的原型模式.何谓原型模式:简单来说就是将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。使用原型模式,就可以简化实例化的过程,不必依赖于构造函数或者new关键字.由于java提供了clone方法......
  • JAVA设计模式(二)-简单工厂
    JAVA设计模式(二)-简单工厂本篇文章主要讲下java创建型设计模式中的简单工厂模式.简单工厂模式又叫静态工厂方法模式(StaticFactoryMethodPattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。1:定义接口publicinterfacePeople{v......