白话-23种设计模式11-享元模式

举报
object 发表于 2022/07/07 10:15:10 2022/07/07
【摘要】 一、白话  一个专门做翻译的公司,如果有一段英文著作需要翻译,我先看看公司是否存在有会英语的员工,如果有个法语著作,我需要先看看公司有没有会法语的员工,如果没有,则我需要新招入一个。判断公司有没有,有就直接用,没有,则需要新招聘。就类似程序,有这个对象,就直接拿来用,没有,就需要新创建。这就是享元模式,基于工厂的特殊处理。二、定义  一个系统中如果有多个相同的对象,那么只共享一份就可以了,不...

一、白话

  一个专门做翻译的公司,如果有一段英文著作需要翻译,我先看看公司是否存在有会英语的员工,如果有个法语著作,我需要先看看公司有没有会法语的员工,如果没有,则我需要新招入一个。判断公司有没有,有就直接用,没有,则需要新招聘。就类似程序,有这个对象,就直接拿来用,没有,就需要新创建。这就是享元模式,基于工厂的特殊处理

二、定义

  一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象

  何时使用:存在大量相似对象,且对象不用分辨,可以共享一份变量。

  关键:map存储共享变量,工厂模式生成对象

三、示例

// 被共享对象-翻译者
public class Translators {
    // 语言类型
    private String language ;

    public void work() {
        System.out.println(this.language + "翻译员,正在努力翻译中...");
    }

    public Translators(String language) {
        this.language = language;
    }
}
// 工厂-统一生产
public class TranslatorsFactory {
    // 关键,共享存储hashMap
    private static Map<String, Translators> translatorsMap = new ConcurrentHashMap<>();

    public static Translators getInstance(String language){
        Translators translators = translatorsMap.get(language);
        if (translators != null) {
            System.out.println("已存在:" + language + "翻译者,直接使用");
             return translators;
        }
        Translators newTranslators = new Translators(language);
        System.out.println("创建了:" + language + "翻译者");
        translatorsMap.put(language, newTranslators);
        return newTranslators;
    }

    private TranslatorsFactory() {
    }
}
public class FlyweightApplication {

    public static void main(String[] args) {
        String english = "english";
        String chinese = "Chinese";
        // 1.需要英语翻译
        Translators translators1 = TranslatorsFactory.getInstance(english);
        translators1.work();
        // 2.需要中文翻译
        Translators translators2 = TranslatorsFactory.getInstance(chinese);
        translators1.work();
        // 3.再次需要英语翻译
        Translators translators3 = TranslatorsFactory.getInstance(english);
        translators3.work();
        System.out.println("第一个翻译和第三个翻译是否一致:" + (translators3 == translators1));
    }

}

输出结果示例:

    创建了:english翻译者
    english翻译员,正在努力翻译中...
    创建了:Chinese翻译者
    english翻译员,正在努力翻译中...
    已存在:english翻译者,直接使用
    english翻译员,正在努力翻译中...
    第一个翻译和第三个翻译是否一致:true

四、总结

  优点:可避免大量产生相似的对象,降低系统内存。

  实际应用场景:String常量池,数据库连接池。

  实际就是一个工厂模式的改编版,加入了一个缓存池的概念,需要注意线程安全问题。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。