Java享元设计模式优化对象创建提高性能和效率
2023-07-07 19:08:13 来源:脚本之家
目录
介绍实现总结优点缺点应用场景介绍
Java中的享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享尽可能多的对象来减少内存占用和提高性能.
(资料图片仅供参考)
Java享元模式通常包含以下4种角色
享元工厂(Flyweight Factory):负责创建和管理享元对象.具体享元(Concrete Flyweight):实现享元接口并存储与共享状态相关的内部状态.抽象享元(Flyweight):定义享元对象需要实现的接口或抽象类.非共享状态(Unshared State):储存享元对象的非共享状态.注意:抽象享元和非共享状态角色是可选的,可以省略它们将其功能合并到其他角色中
当客户端请求创建或访问一个享元对象时,享元工厂会检查是否已经创建了该对象.如果已经创建,则返回现有对象的引用;如果尚未创建,则创建新的对象并返回其引用.这样客户端可以共享现有对象,而不必创建新的对象,从而减少内存占用和提高性能.
实现
以电商中的商品信息为例,在电商中,每个商品都有一个名称,价格,库存等属性.通常情况下,每个商品都需要单独创建一个对象,这样会导致内存占用增加,而且如果多次购买相同的商品,系统会创建多个相同的对象,浪费资源.
抽象享元
public interface Product { String getName(); double getPrice(); int getStock(); }
具体享元
public class ConcreteProduct implements Product{ private String name; private double price; private int stock; public ConcreteProduct(String name, double price, int stock) { this.name = name; this.price = price; this.stock = stock; } @Override public String getName() { return name; } @Override public double getPrice() { return price; } @Override public int getStock() { return stock; } }
享元工厂
public class ProductFactory { private static MapproductMap = new HashMap<>(); public static Product getProduct(String name, double price, int stock) { String key = name + "_" + price; Product res = productMap.get(key); if (Objects.isNull(res)) { // 如果缓存池内不存在,就创建新对象放置到缓存池 res = new ConcreteProduct(name, price, stock); productMap.put(key, res); } return res; } }
测试
public class Demo { public static void main(String[] args) { Product p1 = ProductFactory.getProduct("iPhone 14 Plus", 8899, 1); Product p2 = ProductFactory.getProduct("iPhone 14 Plus", 8899, 1); System.out.println(p1 == p2); } }
在上面示例代码中,首先创建一个商品接口Product,其中包含了商品的名称,价格,库存等属性.然后创建具体的商品类ConcreteProduct,实现Product接口,并定义共享的内部状态name,price,和stock.接下来我们创建商品工厂ProductFactory,用于创建和管理共享的商品对象,在这个工厂中,我们使用HashMap来储存共享的商品对象,每当客户端需要购买一个商品时,我们先检查是否已经创建了该商品对象,如果已经创建,则返回现有对象的引用,如果未创建,则创建新的对象储存到HashMap并返回其引用.
总结
优点
减少对象的创建,节省内存空间,提高系统性能.通过共享对象,可以使得系统中的相同对象在内存中只存在一份,从而减少内存的开销.提高系统的可扩展性,如果需要增加新的对象,只需要在工厂中创建即可,不需要修改原有代码.提高系统的安全性,共享对象是只读的,不会被修改.缺点
可能会使得系统变得过于复杂,增加了代码的复杂性.需要额外的工作来维护共享对象的一致性,比如需要考虑线程安全等问题.可能会因为共享对象的存在而降低程序的灵活性,比如无法对共享对象进行个性化设置.应用场景
当系统中存在大量相同或相似的对象时,可以考虑使用享元模式来减少内存开销.当需要缓存对象并且可以复用时,也可以考虑使用享元模式.在多线程环境下,可以使用享元模式来实现对象的共享,提高程序的并发性能.在游戏开发中,可以使用享元模式来管理游戏中的角色等对象.到此这篇关于Java享元设计模式优化对象创建提高性能和效率的文章就介绍到这了,更多相关Java享元设计模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
关键词:
[责任编辑:]
相关阅读
- (2023-07-07)Java享元设计模式优化对象创建提高性能和效率
- (2023-07-07)位列山东省第4位!青岛市市立医院再登全国百强榜
- (2023-07-07)A股收盘 | 7月7日创业板指跌1.05%, 两市成交额跌破8000亿
- (2023-07-07)【十佳排名】太原哪家医院人流专家好?
- (2023-07-07)招商蛇口:6月实现签约销售金额296.25亿元 同比减少28.23%
- (2023-07-07)框架图怎么做ppt(框架图怎么做)
- (2023-07-07)imgburn使用教程(imgburn)
- (2023-07-07)【低开震荡失守3200,收星下周面临选择?】
- (2023-07-07)襄阳市旅游服务学校:暖心家访 家校共育
- (2023-07-07)天津市消协发布上半年投诉分析报告:预付式消费涉及较多消费领域
- (2023-07-07)7月7日焦炭期货收盘跌1.78%
- (2023-07-07)稳外贸外资,深圳出台“金融支持外贸24条”
- (2023-07-07)合肥铁路工程学校期末回首耕耘路 蓄力向未来
- (2023-07-07)《原神》3.8一个枫丹人的回忆任务图文流程
- (2023-07-07)保卫萝卜4波仔很忙第二十一关过关方法一览
- (2023-07-07)食品安全、市容环境、夜生活……上海回应设摊管理情况
- (2023-07-07)LG电子二季度营业利润好于三星电子 同比增长12.7%
- (2023-07-07)创业板橡胶板块股票,建议收藏!(名单)
- (2023-07-07)瑞可达(688800.SH):公司目前积极布局开拓海外市场,长期来看未来海外市场收入也将会持续增长
- (2023-07-07)Win11系统wifi总掉线的解决方法
- (2023-07-07)球星赛看点:陈梦单挑朱芊曦,男双阻击勒布伦兄弟,女双中韩大战
- (2023-07-07)13天完成100%签约 7天完成100%搬迁 居民盼来旧住房成套改造
- (2023-07-07)文博日历丨今日小暑 来吸一口“高颜值”清凉
- (2023-07-07)华为云盘古大模型 3.0 正式发布,已在 400 多个行业场景完成验证
- (2023-07-07)27股主力资金净流入超亿元
- (2023-07-07)香飘飘(603711.SH):向激励对象授予1076万份股票期权
- (2023-07-07)种植牙前需要的检查准备
- (2023-07-07)豪华初体验,试驾奔驰EQE
- (2023-07-07)预警!湖北湖南重庆贵州部分地区发生地质灾害气象风险较高
- (2023-07-07)i5与i7有什么区别(i9k和i7有什么区别)