当前位置:网站首页>享元模式-缓存池
享元模式-缓存池
2022-08-10 05:36:00 【yeah_you_are】
描述
享元模式(Flyweight Pattern)主要作用就是减少对象的创建,达到减少内存和提高性能的目的。为了实现这个目的,就需要一个数据结构存储实例化后的对象,需要时直接从中获取。
关键:使用Map或者Set作为存储对象的逻辑,即确保缓存池中存储的对象是唯一的。曾使用队列和List实现存储对象的逻辑,后来在使用缓存池中的对象时出现前后重复的,造成数据计算出现幻读问题。
应用
在图像中,一条线段中使用最多的对象就是点,这里就可以使用缓存池缓存点对象,达到复用内存的目的。
Point类
public class Point{
//x
private int x;
//y
private int y;
public Point() {
}
public Point(int x,int y) {
this.x = x;
this.y = y;
}
public int getX() {
return this.x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return this.y;
}
public void setY(int y) {
this.y = y;
}
}
PointFactory类
public class PointFactory {
private Set<Point> cache = new HashSet<>();
/** 获得Point对象 */
public Point getPoint(int x,int y) {
if (cache.size() == 0) {
return new Point(x,y);
}
Point p = cache.iterator().next();
cache.remove(p);
return p;
}
/** 回收Point对象 */
public void recovery(Point p) {
cache.add(p);
}
/** 回收线条中的Point对象 */
public void recovery(List<Point> line) {
cache.addAll(line);
}
/** 获取长度 */
public int size() {
return cache.size();
}
}
TestDemo
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
//创建点对象生产工厂
PointFactory pointFactory = new PointFactory();
System.out.println("factory size :" + pointFactory.size());
//创建线段A
List<Point> lineA = new ArrayList<>();
lineA.add(pointFactory.getPoint(1,2));
lineA.add(pointFactory.getPoint(2,3));
lineA.add(pointFactory.getPoint(1,2));
lineA.add(pointFactory.getPoint(3,6));
//回收
pointFactory.recovery(lineA);
System.out.println("factory size :" + pointFactory.size());
//创建线段B
List<Point> lineB = new ArrayList<>();
lineB.add(pointFactory.getPoint(2,5));
lineB.add(pointFactory.getPoint(3,5));
lineB.add(pointFactory.getPoint(2,6));
lineB.add(pointFactory.getPoint(22,54));
lineB.add(pointFactory.getPoint(11,50));
pointFactory.recovery(lineB);
System.out.println("factory size :" + pointFactory.size());
//回收相同的点对象
Point p = new Point(1,10);
pointFactory.recovery(p);
System.out.println("factory size :" + pointFactory.size());
p.setX(2);
pointFactory.recovery(p);
System.out.println("factory size :" + pointFactory.size());
}
}
运行结果:
根据运行结果可以知道,当添加相同的对象时,缓存中长度并没有变长,说明它只添加了一个对象,保证了唯一性。
边栏推荐
- 多线程与多进程(概念详细讲解)
- ASP.NET有关于文件上传、下载、全选、删除选中重要干货(亲测有效)
- Unity中实现Animation Clip动画片段的倒播(该案例可以防止动画延迟)
- 【接口自动化】
- 中间件-Rocktmq
- pytorch-10. Convolutional Neural Networks (homework)
- pytorch-06. Logistic regression
- STM32单片机LORA无线远程火灾报警监控系统DS18B20MQ2火焰检测
- 探究乱码问题的本源:GBK,UTF8,UTF16,UTF8BOM,ASN1之间的关联
- 每日刷题(day01)——leetcode 53. 最大子数组和
猜你喜欢
随机推荐
电池级碳酸锂除杂质钙镁离子工艺原理
LeetCode 100. The same tree (simple)
Gradle学习 (一) 入门
【fiddler2】使用fiddler mock response 数据
.Net Core imports tens of millions of data to Mysql
Radon 变换原理和应用
【简易笔记】PyTorch官方教程简易笔记 EP2
21天学习挑战赛--图像物体的边界
LeetCode 938.二叉搜索树的范围和(简单)
(Flutter报错)Cannot run with sound null safety, because the following dependencies
ASP.Net利用代码点击相应按钮来关闭当前的页面(亲测有效)
STM32单片机手机APP蓝牙高亮RGB彩灯控制板任意颜色亮度调光
碳酸锂、碳酸氢锂溶液除钙镁离子工艺原理
Multisim软件的基本使用
51单片机室内环境甲醛PM2.5光照温度湿度检测及窗帘加湿消毒控制系统
STM32单片机LORA无线远程火灾报警监控系统DS18B20MQ2火焰检测
Exploratory Data Analysis EDA
【fiddler4】使用fiddler设置简单并发
STM32单片机手机APP蓝牙高亮RGB彩灯控制板任意颜色亮度调光
工业废酸回收工艺