1、模式介绍:
享元模式是一种结构型设计模式,旨在通过共享对象来有效支持大量细粒度的对象。它通过将对象的状态分为内部状态(可共享)和外部状态(不可共享)来减少内存消耗和提高性能。内部状态存储在享元对象内部,而外部状态则由客户端代码管理和传递。
2、应用场景:
对象池:当程序中存在大量相似对象且不需要区分其具体身份时,可以使用享元模式。比如线程池、连接池等。
文本编辑器:对于每一个字符或者格式化文本片段,如果存在大量相同的文本片段,可以共享相同的内部状态,减少内存消耗。
游戏开发:在游戏中,大量的角色或者粒子对象可能具有相同的外观和行为,可以通过享元模式来节省资源。
字符串常量池:Java中的字符串常量池就是享元模式的一个实际应用,相同的字符串常量在内存中只存储一份,多个字符串变量可以共享同一个常量。
3、优点:
减少内存消耗:通过共享相同的对象实例,减少内存使用。
提高性能:减少了创建对象的时间,特别是在对象频繁被创建和销毁的场景下。
4、缺点:
可能引入额外的复杂性:需要对内部状态和外部状态进行区分和管理,可能增加系统的复杂度。
需要合理划分内部状态和外部状态:不正确的划分可能导致系统的逻辑混乱。
5、代码实现:
/**
* 享元接口
*
* @author FM_南风
* @date 2024/6/27
*/
public interface FlyweightInterface {
//绘画方法
void draw();
}
/**
* 享元实现类
*
* @author FM_南风
* @date 2024/6/27
*/
@Data
public class FlyweightClass implements FlyweightInterface{
private final String color; // 颜色
private int x, y, radius; // 坐标半径
public FlyweightClass(String color) {
this.color = color;
}
@Override
public void draw() {
System.out.println("享元实现类: 绘画 [Color : " + color
+ ", x : " + x + ", y :" + y + ", radius :" + radius);
}
}
/**
* 享元工厂
*
* @author FM_南风
* @date 2024/6/27
*/
public class FlyweightFactory {
private static final Map<String, FlyweightInterface> flyweightMap = new HashMap<>();
public static FlyweightInterface getCircle(String color) {
FlyweightClass flyweightClass = (FlyweightClass) flyweightMap.get(color);
if (flyweightClass == null) {
flyweightClass = new FlyweightClass(color);
flyweightMap.put(color, flyweightClass);
System.out.println("开始创作: " + color);
}
return flyweightClass;
}
}
/**
* 应用
*
* @author FM_南风
* @date 2024/6/27
*/
public class FlyweightClient {
private static final String[] colors = {"红", "绿", "蓝"};
public static void main(String[] args) {
for (int i = 0; i < 20; ++i) {
FlyweightClass circle = (FlyweightClass) FlyweightFactory.getCircle(getRandomColor());
circle.setX(getRandomX());
circle.setY(getRandomY());
circle.setRadius(100);
circle.draw();
}
}
private static String getRandomColor() {
return colors[(int) (Math.random() * colors.length)];
}
private static int getRandomX() {
return (int) (Math.random() * 100);
}
private static int getRandomY() {
return (int) (Math.random() * 100);
}
}
6、结果展示:
7、代码示例说明:
在这个示例中:FlyweightClass类作为具体享元类,颜色(内部状态)color 是享元的一部分,而 x、y、raidus则是外部状态。
FlyweightFactory 类作为享元工厂,负责管理和提供享元对象。享元对象在首次创建时存储在 flyweightMap 中,以便于后续共享使用。
FlyweightClient类作为客户端代码,演示如何使用享元模式来创建和绘制多个圆形对象,共享相同的颜色。
通过享元模式,可以看到多个具有相同颜色的圆形对象共享同一个 FlyweightClass 实例,从而减少了对象的创建和内存消耗。