设计模式-享元模式
享元模式
摘要:当有大量对象即将被创建时,很可能重复创建相同的对象,如果每使用一次就进行一次对象的创建,那么这些对象就会消耗大量内存。此时我们可以将其中相同的部分抽象出来进行存储,当使用相同对象时就无需创建,直接进行使用就可。
意图:运用共享技术有效地支持大量细粒度的对象
主要解决;需要创建大量对象,防止造成内存溢出
如何解决:用唯一标识码判断,如果内存中有,则返回这个唯一标识码所标识的对象
关键代码:用HashMap来对对象进行存储
优点:大大减少对象的创建,降低系统的内存,使效率提高
缺点:提高系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内存状态的变化而变化,否则会造成系统的混乱。
使用场景:系统有大量对象;需要缓冲池的场景。
代码实现
首先还是像以前一样,用一个Shape来作为要创建的对象的接口。其中,有一个draw方法,用来展示不同对象的动作。
public interface Shape {
void draw();
}
接着来画一个圆,创建一个Circle类来实现Shape接口,并且实现其中的draw()方法。
public class Circle implements Shape {
private String color;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public Circle(String color) {
this.color = color;
}
@Override
public void draw() {
System.out.println("Circle's color is : " + color);
}
}
接下来就是享元模式
的关键代码,那就是进行对象的管理。代码如下所示;
public class ShapeFactory {
private static final HashMap<String, Shape> circleMap = new HashMap<>();
public static Shape getCircle(String color) {
Circle circle = (Circle) circleMap.get(color);
if (circle == null) {
circle = new Circle(color);
circleMap.put(color, circle);
System.out.println("Add the object of " + color);
}
return circle;
}
}
ShapeFactory的作用主要是对Shape对象进行管理,只不过这里是仅仅对Circle对象进行了处理。但是如果有其他的Shape的实现,可以创建多个对象。主要的思想就是如果在HashMap中有所需的对象,就直接对其进行返回;如果没有该对象,则对其进行创建,并且进行存储,方便后面进行使用。
接下来就是对这个ShapeFactory
的使用了。
public class FlyWeightDemo {
private static final String colors[] = {"green", "red", "blue", "black", "white"};
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
Circle circle = (Circle) ShapeFactory.getCircle(getRandomColor());
circle.draw();
}
}
private static String getRandomColor() {
return colors[(int) (Math.random() * colors.length)];
}
}
通过10次循环,来对5中颜色的对象进行随机调用,主要的实现逻辑还是ShapeFactory
的相关实现。FlyWeightDemo
的运行结果如下所示:
Add the object of red
Circle's color is : red
Circle's color is : red
Add the object of black
Circle's color is : black
Circle's color is : black
Add the object of blue
Circle's color is : blue
Add the object of white
Circle's color is : white
Circle's color is : red
Add the object of green
Circle's color is : green
Circle's color is : white
Circle's color is : red
可以看到,每当第一次对对象进行调用时,则会对对象进行创建,在时候就不需要再重复进行创建了。当有大量的对象需要创建时,使用享元模式
无疑会给我们带来很大的便利。
Tips
简单总结一下,享元模式
能够在一定程度上带来便利。适用场景是当需要创建大量的数据时,并且可能还会重复对某些对象进行调用。享元模式
核心内容就是通过HashMap来对创建的对象进行管理,有则取之,无则创建
。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!