趣解设计模式之《小王设计的疫苗管理平台系统》

简介: 趣解设计模式之《小王设计的疫苗管理平台系统》

〇、小故事

小王所在公司又接到了一个大单子,就是需要他们开发一个用于给百姓们申请打疫苗的疫苗管理平台系统,在系统中需要填报自己的个人信息用于疫苗检测数据采集。采集表里包含:姓名居住地址要去哪个疫苗检测医院网点注射什么品牌的疫苗……。

小王作为公司的研发主力,自告奋勇的接手了开发任务。“不就是一个疫苗申请信息表吗?so easy~”,小王利用一个周末的时间,就把这个系统做出来了。周一上班,小王给老板演示了一下,老板非常满意。这个系统正是老板心中想到的模样。

周二系统正式上线,但是!没想到才经过了10分钟,系统就崩溃了!为什么啊?小王一查数据,才突然发现,在这短短10分钟,就是有100万人要填报自己的个人信息用于疫苗检测数据采集。系统的内存被打满了,内存溢出导致了系统崩溃。小王将所有用户需要填的信息都设计成了输入框,每个人都需要输入采集表中所有的个人信息,如果一份个人信息是1KB,那么100万用户就是将近1T的内存空间消耗了。

有什么好的解决办法吗?那么针对于这些信息,如果我们每个人填一份这样的信息,其实是对空间的浪费。因为,我们可以看出来,姓名和居住地址是个性化的,但是疫苗检测的医院或网点,以及疫苗的品牌这些都是固定的。那么我们就可以采取将这些通用实例池化,然后直接去池里获取即可。这个解决方式就是我们今天要介绍的设计模——享元模式/蝇量模式

一、模式定义

享元模式/蝇量模式flyweight Pattern

享元模式是池技术的重要实现方式,其定义如下:使用共享对象可以有效地支持大量的细粒度的对象

二、模式类图

根据上面的小故事,我们来绘制出相关模式的类图。首先,我们需要抽取原有疫苗信息中可以共享的部分,将这些信息池化起来NucleicInfoClient.java,然后,当我们需要展示用户信息的时候,其实分为了两个部分,一个是共享信息(池化信息)NucleicInfo.java,一个是个性化信息(非池化信息)PersonInfo.java,具体如下所示:

三、代码实现

人员信息实体类PersonInfo.java

@Data
@NoArgsConstructor
@AllArgsConstructor
public class PersonInfo {
    // 姓名
    private String name;
    // 居住的详细地址
    private String address;
    // 疫苗医院或网点唯一标识
    private Integer nucleicId;
}

疫苗医院网点信息信息NucleicInfo.java

@Data
@AllArgsConstructor
@NoArgsConstructor
public class NucleicInfo {
    // 唯一标识
    private Integer id;
    // 疫苗医院网点名称
    private String name;
}

疫苗医院网点信息客户端类NucleicInfoClient.java

public class NucleicInfoClient {
    // 存储疫苗医院和网点的pool
    private HashMap<Integer, NucleicInfo> pool = Maps.newHashMap();
    // 构造函数中初始化池中数据
    public NucleicInfoClient() {
        NucleicInfo nucleicInfo;
        for (int i = 1; i <=10; i++) {
            nucleicInfo = new NucleicInfo(i, "北京市第" + i + "医院疫苗网点");
            pool.put(nucleicInfo.getId(), nucleicInfo);
        }
    }
    public NucleicInfo getNucleicInfo(Integer key) {
        if (key == null || !pool.containsKey(key)) 
            return null;
        return pool.get(key);
    }
}

蝇量模式测试类FlyweightTest.java

public class FlyweightTest {
    private static NucleicInfoClient client = new NucleicInfoClient();
    public static void main(String[] args) {
        PersonInfo bob = new PersonInfo("bob", "北京市海淀区xx大街xx小区x号楼x号", 2);
        PersonInfo muse = new PersonInfo("muse", "北京市朝阳区yy大街yy小区y号楼y号", 7);
        PersonInfo john = new PersonInfo("john", "上海市市徐汇区zz大街zz小区z号楼z号", 4);
        printPersonInfo(bob);
        printPersonInfo(muse);
        printPersonInfo(john);
    }
    public static void printPersonInfo(PersonInfo personInfo) {
        NucleicInfo nucleicInfo = client.getNucleicInfo(personInfo.getNucleicId());
        System.out.println(String.format("姓名=%s 居住地址=%s 疫苗网点=%s", personInfo.getName(), personInfo.getAddress(),
                nucleicInfo.getName()));
    }
}

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

相关文章
|
6月前
|
设计模式
二十三种设计模式全面解析-职责链模式的高级应用-日志记录系统
二十三种设计模式全面解析-职责链模式的高级应用-日志记录系统
103 1
|
设计模式
趣解设计模式之《小王的披萨店续集》
趣解设计模式之《小王的披萨店续集》
75 0
|
设计模式
趣解设计模式之《当代毕加索小王》
趣解设计模式之《当代毕加索小王》
53 0
|
6月前
|
设计模式
二十三种设计模式全面解析-组合模式与享元模式的结合应用:实现对象的共享和高效管理
二十三种设计模式全面解析-组合模式与享元模式的结合应用:实现对象的共享和高效管理
|
3月前
|
设计模式 存储 前端开发
揭秘.NET架构设计模式:如何构建坚不可摧的系统?掌握这些,让你的项目无懈可击!
【8月更文挑战第28天】在软件开发中,设计模式是解决常见问题的经典方案,助力构建可维护、可扩展的系统。本文探讨了.NET中三种关键架构设计模式:MVC、依赖注入与仓储模式,并提供了示例代码。MVC通过模型、视图和控制器分离关注点;依赖注入则通过外部管理组件依赖提升复用性和可测性;仓储模式则统一数据访问接口,分离数据逻辑与业务逻辑。掌握这些模式有助于开发者优化系统架构,提升软件质量。
55 5
|
4月前
|
设计模式 存储 缓存
Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
57 0
|
6月前
|
设计模式 JavaScript Java
[设计模式Java实现附plantuml源码~结构型] 扩展系统功能——装饰模式
[设计模式Java实现附plantuml源码~结构型] 扩展系统功能——装饰模式
|
设计模式
趣解设计模式之《小王的披萨店》
趣解设计模式之《小王的披萨店》
50 1
|
设计模式 SQL 数据库
淘东电商项目(61) -聚合支付(基于模板方法设计模式管理支付回调)
淘东电商项目(61) -聚合支付(基于模板方法设计模式管理支付回调)
82 0
|
6月前
|
设计模式 存储 缓存
第三篇 结构型设计模式 - 简化复杂系统的结构
第三篇 结构型设计模式 - 简化复杂系统的结构

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    43
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    50
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    58
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    38
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    63
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    58
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    42
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    50
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    110
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    78
  • 下一篇
    无影云桌面