白话-23种设计模式11-享元模式
【摘要】 一、白话 一个专门做翻译的公司,如果有一段英文著作需要翻译,我先看看公司是否存在有会英语的员工,如果有个法语著作,我需要先看看公司有没有会法语的员工,如果没有,则我需要新招入一个。判断公司有没有,有就直接用,没有,则需要新招聘。就类似程序,有这个对象,就直接拿来用,没有,就需要新创建。这就是享元模式,基于工厂的特殊处理。二、定义 一个系统中如果有多个相同的对象,那么只共享一份就可以了,不...
一、白话
一个专门做翻译的公司,如果有一段英文著作需要翻译,我先看看公司是否存在有会英语的员工,如果有个法语著作,我需要先看看公司有没有会法语的员工,如果没有,则我需要新招入一个。判断公司有没有,有就直接用,没有,则需要新招聘。就类似程序,有这个对象,就直接拿来用,没有,就需要新创建。这就是享元模式,基于工厂的特殊处理。
二、定义
一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象
何时使用:存在大量相似对象,且对象不用分辨,可以共享一份变量。
关键: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)