Java享元设计模式优化对象创建提高性能和效率
作者:.番茄炒蛋 发布时间:2022-05-26 23:12:02
介绍
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 Map
测试
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并返回其引用.
总结
优点
减少对象的创建,节省内存空间,提高系统性能.
通过共享对象,可以使得系统中的相同对象在内存中只存在一份,从而减少内存的开销.
提高系统的可扩展性,如果需要增加新的对象,只需要在工厂中创建即可,不需要修改原有代码.
提高系统的安全性,共享对象是只读的,不会被修改.
缺点
可能会使得系统变得过于复杂,增加了代码的复杂性.
需要额外的工作来维护共享对象的一致性,比如需要考虑线程安全等问题.
可能会因为共享对象的存在而降低程序的灵活性,比如无法对共享对象进行个性化设置.
应用场景
当系统中存在大量相同或相似的对象时,可以考虑使用享元模式来减少内存开销.
当需要缓存对象并且可以复用时,也可以考虑使用享元模式.
在多线程环境下,可以使用享元模式来实现对象的共享,提高程序的并发性能.
在游戏开发中,可以使用享元模式来管理游戏中的角色等对象.
来源:https://blog.csdn.net/qq_43135259/article/details/129708219


猜你喜欢
- 获取自定义菜单查询返回的结果有乱码解决方法:string Posturl = "https://api.weixin.qq.com
- 项目中需要webview重定向,但是由于一个webveiw里面有许多加载操作,因此在调用webview。goback()方法时,往往达不到我
- C# 3.0为你提供了对象集合初始化器:/// <summary>/// 图书类/// </summary>publ
- 一、项目目录即一个空项目里,有两个springboot的Module。当需要修改kuangshen-es-api这个Module的jdk版本
- 简介本文主要讲解java代码如何利用selenium操作浏览器上传和下载文件代码教程。上传文件常见的 web 页面的上传,一般使用 inpu
- 首先javascript只有这些个类型:1、Number 在JavaScript中的双精度浮点格式 2、String 双引号的反斜杠转义的U
- 我们在使用一些开源调度系统(比如:elastic-job等)的时候,对于任务的执行时间通常都是有规律性的,可能是每隔半小时执行一次,或者每天
- 一、配置xml路径mybatis-plus:mapper-locations: classpath:mapper/*.xml二、编写Mapp
- 所属命名空间:System.Collections.Generic public class
- 一、概述UDP和TCP是网络通讯常用的两个传输协议,C#一般可以通过Socket来实现UDP和TCP通讯,由于.NET框架通过UdpClie
- 本项目为大家分享了Java实现简单计算器功能的具体代码,供大家参考,具体内容如下一 项目说明实训目的:掌握 Java GUI 开发中的布局管
- 在Spring Boot Actuator中提供很多像health、metrics等实时监控接口,可以方便我们随时跟踪服务的性能指标。Spr
- 本文实例讲述了Java自定义注解用法。分享给大家供大家参考,具体如下:一 自定义注解语法[public] @interface Annota
- map中相同的key保存多个value值在java中,Map集合中只能保存一个相同的key,如果再添加相同的key,则之后添加的key的值会
- Java中获取整点时间戳在实际的开发过程中,前端给后端传时间的时候,有时候传的是整点数值,比如:timeList=[00,01,02,03,
- 从功能上说,可以分为两部分,分布式功能和数据功能。分布式功能主要是节点集群及集群附属功能如restful借口、集群性能检测功能等,数据功能主
- 前言之前一篇文章介绍了基本的统一异常处理思路: Spring MVC/Boot 统一异常处理最佳实践.上篇文章也有许多人提出了一些问题:如何
- 前言Java项目开发中经常要用到分页功能,现在普遍使用SpringBoot进行快速开发,而数据层主要整合SpringDataJPA和MyBa
- spring boot配置hikari连接池属性事件起因与一个简单应用经常发生Young GC,甚至在没有请求量的情况下也经常发生GC (A
- Flyway是一款开源的数据库版本管理工具,它更倾向于规约优于配置的方式。第一步:pom.xml添加maven依赖<!-- https