目录
设计模式是一种用于解决在特定上下文中经常出现的问题的优秀解决方案。它们为开发人员提供了一种通用的设计语言,有助于创建灵活且可维护的代码。享元设计模式(Flyweight Pattern)是结构型模式之一,它通过共享对象来减少系统中对象的数量,从而降低系统资源消耗,提高系统性能。
享元设计模式(Flyweight Pattern)是众多设计模式中的一种,它专注于解决由于创建大量相似对象而导致的系统资源消耗过高的问题。这一模式的核心思想是“共享”,即通过共享尽可能多的对象来减少系统中对象的总数,进而降低内存占用和提高系统性能。
在享元模式中,一个关键的概念是将对象的状态划分为两部分:内在状态(Intrinsic State)和外在状态(Extrinsic State)。
享元模式通过实现一个享元工厂(Flyweight Factory)来管理对象的创建和共享。享元工厂会维护一个已创建享元对象的缓存(通常是一个哈希表或其他快速查找数据结构),并根据请求的类型(通常由内在状态决定)来返回相应的对象实例。如果请求的类型在缓存中已存在,则直接返回该实例;如果不存在,则创建一个新的享元对象,将其添加到缓存中,并返回给请求者。
综上所述,享元设计模式是一种通过共享对象来优化系统资源消耗和提高性能的设计方案。它通过将对象状态划分为内在状态和外在状态,并利用享元工厂来管理对象的创建和共享,从而实现了对相似对象的高效处理。
享元模式的核心思想是“共享”。当系统中需要创建大量相似对象时,享元模式通过以下步骤来优化对象的创建和使用:
享元模式的实现通常涉及到一个享元类(表示要共享的对象),一个享元工厂类(负责创建和管理享元实例),以及客户端代码。下面代码展示如何使用享元模式来减少具有相同属性的对象的数量。
首先,定义享元类 Circle
,表示一个圆形对象,其内在状态是颜色,这里假设所有圆的大小相同,因此不需要作为内在状态。
public class Circle {
private String color; // 内在状态:颜色
public Circle(String color) {
this.color = color;
}
public String getColor() {
return color;
}
// 假设的绘制方法,这里仅打印信息
public void draw() {
System.out.println("绘制一个颜色为 " + color + " 的圆形");
}
}
然后,定义享元工厂类 CircleFactory
,它负责管理并缓存已经创建的 Circle
对象。
import java.util.HashMap;
import java.util.Map;
public class CircleFactory {
private Map<String, Circle> circleMap = new HashMap<>(); // 用于缓存Circle对象的Map
// 根据颜色获取Circle对象,如果缓存中没有则创建一个
public Circle getCircle(String color) {
Circle circle = circleMap.get(color);
if (circle == null) {
circle = new Circle(color);
circleMap.put(color, circle); // 将新创建的Circle对象加入缓存
}
return circle;
}
}
最后,编写客户端代码来使用享元工厂创建和使用享元对象。
public class FlyweightPatternDemo {
private static final CircleFactory circleFactory = new CircleFactory();
public static void main(String[] args) {
// 从享元工厂获取圆形对象,并绘制它们
Circle circle1 = circleFactory.getCircle("红色");
circle1.draw(); // 输出:绘制一个颜色为 红色的圆形
Circle circle2 = circleFactory.getCircle("蓝色");
circle2.draw(); // 输出:绘制一个颜色为 蓝色的圆形
Circle circle3 = circleFactory.getCircle("红色");
circle3.draw(); // 输出:绘制一个颜色为 红色的圆形(注意这里是复用的circle1)
// 验证circle1和circle3是否是同一个对象
System.out.println(circle1 == circle3); // 输出:true
}
}
Circle
类是享元,它的内在状态是颜色。CircleFactory
是一个享元工厂,它使用一个 HashMap
来缓存已经创建的 Circle
对象。当客户端请求一个具有特定颜色的圆形时,享元工厂首先检查缓存中是否已经有一个具有该颜色的圆形。如果有,则返回该对象;否则,创建一个新的 Circle
对象并将其添加到缓存中。通过这种方式,具有相同颜色的圆形对象实例在系统中只会被创建一次,从而减少了内存占用。
优点:
适用场景:
享元设计模式是一种高效处理大量相似对象的设计方案。它通过共享对象实例来减少资源消耗和提高性能,适用于多种场景。在使用享元模式时,需要仔细识别对象的共享状态和变化状态,并合理设计享元类和享元工厂。通过合理运用享元模式,可以构建出更加灵活、高效和可维护的软件系统。