设计模式 - 享元模式(Flyweight Pattern)
介绍
享元模式是一种结构型设计模式,它通过共享技术来尽可能地复用已创建的对象,从而支持大量细粒度的对象。这种模式可以用来减少内存中对象的数量,尤其是当对象创建成本较高且存在大量重复实例时。
实现
我们以一个文本编辑器中的字符渲染为例来说明享元模式的实现。假设我们需要渲染大量的字符,并且这些字符具有相同的属性(如字体、大小、颜色等),我们希望通过享元模式来减少内存的使用。
定义享元接口
首先定义一个享元接口,它包含共享和非共享的状态。
interface Character {
void display(int x, int y);
}
创建具体享元类
然后创建具体的享元类,这些类包含了共享的内部状态(如字符本身)。
class SharedCharacter implements Character {
private char character;
private Font font;
private Color color;
public SharedCharacter(char character, Font font, Color color) {
this.character = character;
this.font = font;
this.color = color;
}
@Override
public void display(int x, int y) {
System.out.printf("Rendering '%c' at (%d, %d) with font '%s' and color '%s'.%n",
character, x, y, font.getName(), color.getName());
}
}
创建享元工厂
创建一个享元工厂类来管理享元对象的创建和获取。
import java.util.HashMap;
import java.util.Map;
class CharacterFactory {
private Map<String, Character> pool = new HashMap<>();
public Character getCharacter(char character, Font font, Color color) {
String key = getKey(character, font, color);
if (!pool.containsKey(key)) {
Character newCharacter = new SharedCharacter(character, font, color);
pool.put(key, newCharacter);
}
return pool.get(key);
}
private String getKey(char character, Font font, Color color) {
return character + ":" + font.getName() + ":" + color.getName();
}
}
使用享元模式
接下来,在主程序中使用享元模式来渲染字符。
public class TextEditor {
public static void main(String[] args) {
CharacterFactory factory = new CharacterFactory();
Font fontArial = new Font("Arial", 12);
Color blackColor = new Color("Black");
// 创建字符 'A'
Character aChar = factory.getCharacter('A', fontArial, blackColor);
aChar.display(100, 100); // 输出渲染信息
// 再次获取字符 'A',应当从池中获取已有的对象
Character anotherAChar = factory.getCharacter('A', fontArial, blackColor);
anotherAChar.display(200, 200); // 输出渲染信息
// 创建字符 'B'
Character bChar = factory.getCharacter('B', fontArial, blackColor);
bChar.display(300, 300); // 输出渲染信息
}
}
定义字体和颜色类
为了完成示例,我们还需要定义字体和颜色类。
class Font {
private String name;
private int size;
public Font(String name, int size) {
this.name = name;
this.size = size;
}
public String getName() {
return name;
}
}
class Color {
private String name;
public Color(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
使用场景
享元模式适用于以下情况:
- 当一个应用程序使用了大量的细粒度对象。
- 这些对象的大部分状态可以外部化。
- 许多对象可以用相对较小的存储空间进行共享。
- 应用程序不依赖于外部状态。
总结
享元模式通过共享对象来减少内存中的对象数量,从而节省内存。这种方式尤其适用于对象创建成本高且存在大量重复实例的情况。享元模式通过享元工厂来管理对象的创建和共享,使得对象的管理和使用变得更加高效。
以上就是享元模式的一个实现案例,希望这篇文章能帮助你理解享元模式的使用方式及其优势。
评论区