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;}@Overridepublic 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 实例,从而减少了对象的创建和内存消耗。