java: Flyweight Pattern

发布时间:2026/7/24 23:56:34
java: Flyweight Pattern 项目结构/** * encoding: utf-8 * 版权所有 2026 ©涂聚文有限公司 ® * 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 * 描述结构型模式 Structural Patterns 享元模式Flyweight Pattern * Author : geovindu,Geovin Du 涂聚文. * IDE : IntelliJ IDEA 2024.3.6 Java 17 * # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j * # OS : window10 * Datetime : 2026 - 2026/7/23 - 22:45 * User : geovindu * Product : IntelliJ IDEA * Project : javadesginpattern * File : IStaffFlyweight.java * explain : 学习 类 **/ package FlyweightPattern.core.abstractions; import org.slf4j.Logger; /** * 享元抽象接口珠宝行业岗位工作人员 * 内部状态岗位名称、岗位职责、所属部门可共享常驻内存 * 外部状态业务流水号、业务描述每次执行动态传入不存入享元对象 */ public interface IStaffFlyweight { /** * 执行岗位业务操作 * param logger 日志实例 * param businessNo 业务流水号【外部状态】 * param businessContext 业务上下文描述【外部状态】 */ void executeWork(Logger logger, String businessNo, String businessContext); /** * 获取岗位名称内部共享状态 * return 岗位名称 */ String getPositionName(); /** * 获取岗位职责内部共享状态 * return 职责描述 */ String getDuty(); } /** * encoding: utf-8 * 版权所有 2026 ©涂聚文有限公司 ® * 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 * 描述结构型模式 Structural Patterns 享元模式Flyweight Pattern * Author : geovindu,Geovin Du 涂聚文. * IDE : IntelliJ IDEA 2024.3.6 Java 17 * # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j * # OS : window10 * Datetime : 2026 - 2026/7/23 - 23:01 * User : geovindu * Product : IntelliJ IDEA * Project : javadesginpattern * File : IStaffFlyweightFactory.java * explain : 学习 类 **/ package FlyweightPattern.core.abstractions; /** * 享元工厂接口负责创建、缓存岗位享元实例 * 保证同一岗位全局只存在唯一实例实现对象复用降低GC压力 */ public interface IStaffFlyweightFactory { /** * 根据岗位名称获取享元对象 * param positionName 岗位名称 * return 岗位享元实例 */ IStaffFlyweight getStaffFlyweight(String positionName); /** * 获取当前缓存享元数量 * return 缓存数量 */ int getCacheCount(); /** * 预加载珠宝全部业务岗位享元 */ void preloadAllJewelryPositions(); } /** * encoding: utf-8 * 版权所有 2026 ©涂聚文有限公司 ® * 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 * 描述结构型模式 Structural Patterns 享元模式Flyweight Pattern * Author : geovindu,Geovin Du 涂聚文. * IDE : IntelliJ IDEA 2024.3.6 Java 17 * # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j * # OS : window10 * Datetime : 2026 - 2026/7/23 - 23:02 * User : geovindu * Product : IntelliJ IDEA * Project : javadesginpattern * File : PositionDutyModel.java * explain : 学习 类 **/ package FlyweightPattern.core.models; /** * 岗位基础信息模型用于初始化享元内部状态 */ public class PositionDutyModel { /**岗位名称*/ private String positionName; /**所属部门*/ private String department; /**岗位职责描述*/ private String duty; public String getPositionName() { return positionName; } public void setPositionName(String positionName) { this.positionName positionName; } public String getDepartment() { return department; } public void setDepartment(String department) { this.department department; } public String getDuty() { return duty; } public void setDuty(String duty) { this.duty duty; } } /** * encoding: utf-8 * 版权所有 2026 ©涂聚文有限公司 ® * 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 * 描述结构型模式 Structural Patterns 享元模式Flyweight Pattern * Author : geovindu,Geovin Du 涂聚文. * IDE : IntelliJ IDEA 2024.3.6 Java 17 * # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j * # OS : window10 * Datetime : 2026 - 2026/7/23 - 23:03 * User : geovindu * Product : IntelliJ IDEA * Project : javadesginpattern * File : JewelryStaffFlyweightFactory.java * explain : 学习 类 **/ package FlyweightPattern.infrastructure.flyweight; import FlyweightPattern.core.abstractions.IStaffFlyweight; import FlyweightPattern.core.abstractions.IStaffFlyweightFactory; import FlyweightPattern.core.models.PositionDutyModel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * 珠宝岗位享元工厂实现 * ConcurrentHashMap 保证多线程并发安全缓存 */ public class JewelryStaffFlyweightFactory implements IStaffFlyweightFactory { private static final Logger log LoggerFactory.getLogger(JewelryStaffFlyweightFactory.class); /**享元对象缓存池线程安全Map Key岗位名称*/ private final ConcurrentHashMapString, IStaffFlyweight flyweightPool new ConcurrentHashMap(); public JewelryStaffFlyweightFactory() { preloadAllJewelryPositions(); } /** * 获取岗位享元存在直接返回不存在抛出异常 */ Override public IStaffFlyweight getStaffFlyweight(String positionName) { if (positionName null || positionName.isBlank()) { throw new IllegalArgumentException(岗位名称不能为空); } if (flyweightPool.containsKey(positionName)) { log.debug(命中享元缓存岗位{}, positionName); return flyweightPool.get(positionName); } throw new RuntimeException(未预加载岗位【 positionName 】请检查岗位配置); } Override public int getCacheCount() { return flyweightPool.size(); } /** * 预加载珠宝全业务岗位享元 */ Override public void preloadAllJewelryPositions() { log.info(开始预加载珠宝行业所有业务岗位享元对象); ListPositionDutyModel positionList List.of( createModel(原料采购核验, 供应链部, 贵金属/宝石原料采购、入库质检、原料成色核验、供应商对账), createModel(设计制图, 研发设计部, 首饰款式创意、CAD制图、3D建模、效果图输出、工艺图纸), createModel(加工生产, 生产车间, 失蜡铸造、执模、镶石、抛光、电镀、半成品加工), createModel(质检, 品控部, 成色检测、宝石分级、外观瑕疵检验、尺寸校验、合格判定), createModel(包装, 仓储部, 首饰清洁、礼盒封装、标签粘贴、产品入库分拣), createModel(物流, 仓储部, 订单打包、快递对接、物流跟踪、货品出入库管控), createModel(财务, 财务部, 成本核算、应收应付、开票、工资核算、资金管理), createModel(营销推广, 市场部, 线上线下推广、直播运营、活动策划、品牌宣传), createModel(业务, 销售部, 客户接待、订单洽谈、零售批发、售后沟通), createModel(人事行政, 行政人事部, 招聘、考勤、制度管理、后勤、办公物资管理), createModel(IT, 信息部, 系统运维、服务器维护、软件故障处理、数据保障), createModel(培训, 培训部, 员工技能培训、销售话术培训、工艺知识教学) ); for (PositionDutyModel item : positionList) { StaffFlyweight flyweight new StaffFlyweight(item.getPositionName(), item.getDepartment(), item.getDuty()); flyweightPool.putIfAbsent(item.getPositionName(), flyweight); log.debug(岗位享元加载完成{}, item.getPositionName()); } log.info(岗位享元预加载完成缓存岗位总数{}, flyweightPool.size()); } private PositionDutyModel createModel(String posName, String dept, String duty) { PositionDutyModel m new PositionDutyModel(); m.setPositionName(posName); m.setDepartment(dept); m.setDuty(duty); return m; } } /** * encoding: utf-8 * 版权所有 2026 ©涂聚文有限公司 ® * 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 * 描述结构型模式 Structural Patterns 享元模式Flyweight Pattern * Author : geovindu,Geovin Du 涂聚文. * IDE : IntelliJ IDEA 2024.3.6 Java 17 * # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j * # OS : window10 * Datetime : 2026 - 2026/7/23 - 23:02 * User : geovindu * Product : IntelliJ IDEA * Project : javadesginpattern * File : StaffFlyweight.java * explain : 学习 类 **/ package FlyweightPattern.infrastructure.flyweight; import FlyweightPattern.core.abstractions.IStaffFlyweight; import org.slf4j.Logger; import java.util.Random; /** * 具体享元对象珠宝企业岗位人员 * 内部状态不可变对象全局复用外部状态通过方法参数传入 */ public class StaffFlyweight implements IStaffFlyweight { /**岗位名称 - 内部状态不可变*/ private final String positionName; /**所属部门 - 内部状态不可变*/ private final String department; /**岗位职责 - 内部状态不可变*/ private final String duty; private static final Random RANDOM new Random(); /** * 构造函数初始化固定内部状态 * param positionName 岗位名称 * param department 部门名称 * param duty 岗位职责 */ public StaffFlyweight(String positionName, String department, String duty) { this.positionName positionName; this.department department; this.duty duty; } /** * 执行岗位业务外部状态由调用方传入 */ Override public void executeWork(Logger logger, String businessNo, String businessContext) { logger.info([业务单号:{}]【{}-{}】开始处理业务{}岗位职责{}, businessNo, department, positionName, businessContext, duty); simulateBusinessWork(logger, businessNo); } /** * 模拟岗位业务执行逻辑 */ private void simulateBusinessWork(Logger logger, String businessNo) { int costMs RANDOM.nextInt(50, 200); try { Thread.sleep(costMs); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } double randVal RANDOM.nextDouble(); if (randVal 0.08) { logger.warn([业务单号:{}]【{}】业务存在轻微异常风险, businessNo, positionName); } if (randVal 0.03) { logger.error([业务单号:{}]【{}】业务处理出现临时故障, businessNo, positionName); } logger.debug([业务单号:{}]【{}】处理耗时{}ms, businessNo, positionName, costMs); } Override public String getPositionName() { return positionName; } Override public String getDuty() { return duty; } } /** * encoding: utf-8 * 版权所有 2026 ©涂聚文有限公司 ® * 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 * 描述结构型模式 Structural Patterns 享元模式Flyweight Pattern * Author : geovindu,Geovin Du 涂聚文. * IDE : IntelliJ IDEA 2024.3.6 Java 17 * # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j * # OS : window10 * Datetime : 2026 - 2026/7/23 - 23:04 * User : geovindu * Product : IntelliJ IDEA * Project : javadesginpattern * File : LoggingConfiguration.java * explain : 学习 类 **/ package FlyweightPattern.infrastructure.logging; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Configuration; /** * 日志配置入口 * 实际日志滚动策略由 resources/logback.xml 控制 * 日志目录Logs/yyyy-MM-dd/app-{Level}.log * 控制台与文件日志格式保持一致 */ Configuration public class LoggingConfiguration { private static final Logger log LoggerFactory.getLogger(LoggingConfiguration.class); public LoggingConfiguration() { log.info(日志系统初始化完成日志根目录Logs/); } } /** * encoding: utf-8 * 版权所有 2026 ©涂聚文有限公司 ® * 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 * 描述结构型模式 Structural Patterns 享元模式Flyweight Pattern * Author : geovindu,Geovin Du 涂聚文. * IDE : IntelliJ IDEA 2024.3.6 Java 17 * # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j * # OS : window10 * Datetime : 2026 - 2026/7/23 - 23:04 * User : geovindu * Product : IntelliJ IDEA * Project : javadesginpattern * File : IJewelryBusinessScheduler.java * explain : 学习 类 **/ package FlyweightPattern.business.abstractions; import java.util.concurrent.CompletableFuture; /** * 珠宝业务调度器抽象 * 负责驱动整条珠宝业务流水线执行 */ public interface IJewelryBusinessScheduler { /** * 执行单条订单完整业务流程 * param businessNo 业务流水号 * param orderTitle 订单名称 * return 异步任务 */ CompletableFutureVoid runFullJewelryBusinessFlowAsync(String businessNo, String orderTitle); /** * 并发批量执行多条订单 * param orderCount 模拟订单数量 * return 异步任务 */ CompletableFutureVoid runMultiOrderConcurrentAsync(int orderCount); } /** * encoding: utf-8 * 版权所有 2026 ©涂聚文有限公司 ® * 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 * 描述结构型模式 Structural Patterns 享元模式Flyweight Pattern * Author : geovindu,Geovin Du 涂聚文. * IDE : IntelliJ IDEA 2024.3.6 Java 17 * # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j * # OS : window10 * Datetime : 2026 - 2026/7/23 - 23:04 * User : geovindu * Product : IntelliJ IDEA * Project : javadesginpattern * File : JewelryBusinessScheduler.java * explain : 学习 类 **/ package FlyweightPattern.business.implementations; import FlyweightPattern.business.abstractions.IJewelryBusinessScheduler; import FlyweightPattern.core.abstractions.IStaffFlyweight; import FlyweightPattern.core.abstractions.IStaffFlyweightFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.List; import java.util.concurrent.CompletableFuture; /** * 珠宝业务流水线调度实现 * 串联全流程岗位通过享元工厂复用岗位实例 */ public class JewelryBusinessScheduler implements IJewelryBusinessScheduler { private static final Logger log LoggerFactory.getLogger(JewelryBusinessScheduler.class); private final IStaffFlyweightFactory flyweightFactory; public JewelryBusinessScheduler(IStaffFlyweightFactory flyweightFactory) { this.flyweightFactory flyweightFactory; } /** * 单订单完整业务流水线 */ Override public CompletableFutureVoid runFullJewelryBusinessFlowAsync(String businessNo, String orderTitle) { return CompletableFuture.runAsync(() - { log.info(启动珠宝完整业务流程单号:{},订单:{}, businessNo, orderTitle); ListString positionSequence List.of( 原料采购核验, 设计制图, 加工生产, 质检, 包装, 物流, 财务, 营销推广, 业务, 人事行政, IT, 培训 ); for (String position : positionSequence) { IStaffFlyweight staff flyweightFactory.getStaffFlyweight(position); staff.executeWork(log, businessNo, 订单[ orderTitle ]流程处理); try { Thread.sleep(30); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } log.info(珠宝业务流程全部执行完成单号:{}, businessNo); }); } /** * 多订单并发执行测试高并发场景 */ Override public CompletableFutureVoid runMultiOrderConcurrentAsync(int orderCount) { log.info(开始并发模拟{}条珠宝订单业务流程, orderCount); CompletableFuture?[] tasks new CompletableFuture[orderCount]; for (int i 1; i orderCount; i) { String orderNo JH System.currentTimeMillis() String.format(%06d, i); String orderName 定制首饰订单- i 号; tasks[i - 1] runFullJewelryBusinessFlowAsync(orderNo, orderName); } return CompletableFuture.allOf(tasks) .thenRun(() - log.info(全部并发订单处理完毕)); } } /** * encoding: utf-8 * 版权所有 2026 ©涂聚文有限公司 ® * 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 * 描述结构型模式 Structural Patterns 享元模式Flyweight Pattern * Author : geovindu,Geovin Du 涂聚文. * IDE : IntelliJ IDEA 2024.3.6 Java 17 * # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j * # OS : window10 * Datetime : 2026 - 2026/7/23 - 23:05 * User : geovindu * Product : IntelliJ IDEA * Project : javadesginpattern * File : ScheduleStartupService.java * explain : 学习 类 **/ package FlyweightPattern.scheduler.hostedservices; import FlyweightPattern.scheduler.jobs.JewelryScheduleJob; import org.quartz.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; /** * 调度启动托管服务 * Spring容器启动完成后自动注册定时任务 */ Service public class ScheduleStartupService { private static final Logger log LoggerFactory.getLogger(ScheduleStartupService.class); private final Scheduler scheduler; public ScheduleStartupService(Scheduler scheduler) { this.scheduler scheduler; } EventListener(ContextRefreshedEvent.class) public void startScheduler() throws SchedulerException { log.info(开始初始化Quartz定时调度器); // 任务1每隔30秒自动执行一次模拟日常自动业务流水线 JobKey job1Key new JobKey(JewelryNormalFlowJob, JewelryGroup); JobDetail normalJob JobBuilder.newJob(JewelryScheduleJob.class) .withIdentity(job1Key) .storeDurably() .build(); normalJob.getJobDataMap().put(BusinessNo, JH-SCHED-001); normalJob.getJobDataMap().put(OrderTitle, 定时自动-日常首饰生产订单); Trigger normalTrigger TriggerBuilder.newTrigger() .withIdentity(NormalFlowTrigger, JewelryGroup) .startNow() .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(30) .repeatForever()) .build(); // 任务2Cron示例【每天凌晨02:00执行批量10单并发】 JobKey job2Key new JobKey(JewelryBatchJob, JewelryGroup); JobDetail batchJob JobBuilder.newJob(JewelryScheduleJob.class) .withIdentity(job2Key) .storeDurably() .build(); batchJob.getJobDataMap().put(ConcurrentOrderCount, 10); Trigger batchTrigger TriggerBuilder.newTrigger() .withIdentity(BatchFlowTrigger, JewelryGroup) .startNow() .withSchedule(CronScheduleBuilder.cronSchedule(0 0 2 * * ?)) .build(); scheduler.addJob(normalJob, false); scheduler.scheduleJob(normalTrigger); scheduler.addJob(batchJob, false); scheduler.scheduleJob(batchTrigger); scheduler.start(); log.info(Quartz调度器启动成功定时任务已加载); } } /** * encoding: utf-8 * 版权所有 2026 ©涂聚文有限公司 ® * 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 * 描述结构型模式 Structural Patterns 享元模式Flyweight Pattern * Author : geovindu,Geovin Du 涂聚文. * IDE : IntelliJ IDEA 2024.3.6 Java 17 * # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j * # OS : window10 * Datetime : 2026 - 2026/7/23 - 23:05 * User : geovindu * Product : IntelliJ IDEA * Project : javadesginpattern * File : JewelryScheduleJob.java * explain : 学习 类 **/ package FlyweightPattern.scheduler.jobs; import FlyweightPattern.business.abstractions.IJewelryBusinessScheduler; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; /** * 珠宝业务定时任务Job * Quartz调度触发执行完整珠宝业务流水线 */ Component public class JewelryScheduleJob implements Job { private static final Logger log LoggerFactory.getLogger(JewelryScheduleJob.class); private final IJewelryBusinessScheduler businessScheduler; public JewelryScheduleJob(IJewelryBusinessScheduler businessScheduler) { this.businessScheduler businessScheduler; } /** * Quartz任务执行入口 */ Override public void execute(JobExecutionContext context) throws JobExecutionException { try { log.info(【定时任务触发】任务Key:{}, context.getJobDetail().getKey()); String businessNo context.getJobDetail().getJobDataMap().getString(BusinessNo); String orderTitle context.getJobDetail().getJobDataMap().getString(OrderTitle); int concurrentCount context.getJobDetail().getJobDataMap().getInt(ConcurrentOrderCount); if (businessNo ! null !businessNo.isBlank() orderTitle ! null !orderTitle.isBlank()) { businessScheduler.runFullJewelryBusinessFlowAsync(businessNo, orderTitle).join(); } else if (concurrentCount 0) { businessScheduler.runMultiOrderConcurrentAsync(concurrentCount).join(); } else { log.warn(定时任务未传入有效业务参数跳过业务执行); } log.info(【定时任务执行完成】任务Key:{}, context.getJobDetail().getKey()); } catch (Exception ex) { log.error(ex.getMessage(), 【定时任务执行异常】任务Key:{}, context.getJobDetail().getKey()); throw new JobExecutionException(ex); } } }调用/** * encoding: utf-8 * 版权所有 2026 ©涂聚文有限公司 ® * 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 * 描述结构型模式 Structural Patterns 享元模式Flyweight Pattern * Author : geovindu,Geovin Du 涂聚文. * IDE : IntelliJ IDEA 2024.3.6 Java 17 * # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j * # OS : window10 * Datetime : 2026 - 2026/7/5 - 11:03 * User : geovindu * Product : IntelliJ IDEA * Project : javadesginpattern * File : FlyweightBll.java * explain : 学习 类 **/ package BLL; import FlyweightPattern.business.abstractions.IJewelryBusinessScheduler; import FlyweightPattern.business.implementations.JewelryBusinessScheduler; import FlyweightPattern.infrastructure.flyweight.JewelryStaffFlyweightFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.concurrent.CompletableFuture; public class FlyweightBll { private static final Logger logger LoggerFactory.getLogger(FlyweightBll.class); public void demo() { JewelryStaffFlyweightFactory flyweightFactory new JewelryStaffFlyweightFactory(); IJewelryBusinessScheduler businessScheduler new JewelryBusinessScheduler(flyweightFactory); logger.info( 珠宝企业享元模式业务系统启动完成 ); logger.info(享元缓存岗位数量{}, flyweightFactory.getCacheCount()); businessScheduler.runFullJewelryBusinessFlowAsync(JH20260723001, 18K金钻石戒指订单).join(); logger.info(\n-------- 高并发测试并发处理3条订单 --------); businessScheduler.runMultiOrderConcurrentAsync(3).join(); logger.info( 享元模式业务流程全部执行完毕 ); } }输出