享元模式:避免大量相同开销

当系统中存在大量相似对象时,使用享元模式可以有效地减少内存的使用和对象的创建数量。享元模式是一种结构型设计模式,通过共享已经存在的对象来减少内存使用和对象创建的数量。

享元模式的核心思想是将可复用的对象缓存起来,在需要时直接从缓存中获取,而不是重新创建一个新的对象。这些可复用的对象通常会被设计为不可变的,因此可以被多个客户端共享。

具体实现时,通常会创建一个工厂类来管理所有的享元对象,并在需要时返回已有的对象或者创建新的对象。同时,对于那些频繁使用但不易生成的对象,可以考虑提前生成并缓存起来,以便更快地响应客户端请求。

在Java中,String类 就是一个典型的享元模式的例子。由于String对象是不可变的,因此可以被多个客户端共享。当我们需要创建一个新的字符串时,如果该字符串已经存在于缓存池中,那么就直接返回该字符串的引用,否则就创建一个新的字符串并加入到缓存池中。

总之,享元模式可以帮助我们有效地减少内存使用和对象创建的数量,特别是在需要创建大量相似对象的场景下,使用享元模式可以极大地提高系统的性能和可维护性。

示例代码:

import java.util.HashMap;
import java.util.Map;
/**
* 享元模式示例代码
*/
public class FlyweightDemo {
/**
* 抽象享元类
*/
interface Shape {
void draw();
}
/**
* 具体享元类
*/
static class Circle implements Shape {
private String color; // 颜色
private int x; // x坐标
private int y; // y坐标
private int radius; // 半径
public Circle(String color) {
this.color = color;
}
@Override
public void draw() {
System.out.println("画了一个" + color + "圆形,半径为:" + radius + ",坐标为(" + x + "," + y + ")");
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
public void setRadius(int radius) {
this.radius = radius;
}
}
/**
* 享元工厂类
*/
static class ShapeFactory {
private static final Map<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("创建了一个" + color + "圆形对象");
} else {
System.out.println("使用了一个" + color + "圆形对象");
}
return circle;
}
}
/**
* 客户端
*/
public static void main(String[] args) {
Shape redCircle = ShapeFactory.getCircle("红色");
redCircle.setX(10);
redCircle.setY(20);
redCircle.setRadius(30);
redCircle.draw();
Shape blueCircle = ShapeFactory.getCircle("蓝色");
blueCircle.setX(100);
blueCircle.setY(200);
blueCircle.setRadius(300);
blueCircle.draw();
Shape greenCircle = ShapeFactory.getCircle("绿色");
greenCircle.setX(1000);
greenCircle.setY(2000);
greenCircle.setRadius(3000);
greenCircle.draw();
}
}
posted @   穆海如枫  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示