当前位置:网站首页>享元模式-缓存池
享元模式-缓存池
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());
}
}
运行结果:

根据运行结果可以知道,当添加相同的对象时,缓存中长度并没有变长,说明它只添加了一个对象,保证了唯一性。
边栏推荐
- LeetCode 938. Range Sum of Binary Search Trees (Simple)
- The way for programmers to make money from a sideline business and increase their monthly income by 20K
- 基于MNIST数据集的简单FC复现
- 【接口自动化】
- 【图像识别】训练一个最最简单的AI使其识别Vtuber
- 从零开始构建Google Protocol Buffer / protobuf 的helloworld工程(超级详细)
- Notes for RNN
- 卷积神经网络(CNN)实现服装图像分类
- 通过配置CubeMX的TIMER的PWM初始化实现硬件PWM呼吸灯闪烁
- I don't like my code
猜你喜欢
随机推荐
在Unity中让物体围绕自身的x、y、z轴进行旋转(亲测有效)
接口自动化2.0
pytorch-06.逻辑斯蒂回归
电镀废水除六价铬
剑指 Offer(第 2 版)7/5 5-8
LeetCode refers to the offer 21. Adjust the order of the array so that the odd numbers are in front of the even numbers (simple)
Convolutional Neural Network (CNN) for Clothing Image Classification
自定义View的流程总结学习
Notes for SVM
每日刷题(day03)——leetcode 899. 有序队列
GC0053-STM32单片机NTC热敏电阻温度采集及控制LCD1602
优先级队列,大小顶堆PriorityQueue
C陷阱与缺陷 个人阅读笔记
屏幕后期处理之:Sobel算子实现边缘检测
手机端应用类型
从零开始构建Google Protocol Buffer / protobuf 的helloworld工程(超级详细)
LeetCode 162. Finding Peaks (Moderate)
【fiddler4】使用fiddler设置简单并发
在Unity中利用代码动态更改场景中的天空盒
剑指 Offer(第 2 版)7/7 14-17









