读书笔记 仅供参考
简述
可以翻译成享元模式,通过尽量共享实例来避免 new 出实例。
角色和 UML
Flyweight
实例会被共享的类。
FlyweightFactory
生成 Flyweight 的工厂,在工厂中实现共享实例。
Client
使用 FlyweightFactory 生成 Flyweight。
UML
例子
例程是一个显示字符串的程序,但是其中的字符是 BigChar,即是由字符串构成的字符:
......##........
..######........
......##........
......##........
......##........
......##........
..##########....
................
这样的字符保存在文件当中,当输入字符串后,就从文件当中读出字符,再显示出来。Flyweight 模式就是将这些大字符实例进行共享。
UML
// 表示大型字符
public class BigChar {
private char charName;
//大型字符对应的字符串,由 # . \n 组成
private String fontData;
public BigChar(char charName) {
this.charName = charName;
try {
BufferedReader reader = new BufferedReader(
//从文件中将大型字符的字符串读出
new FileReader("file/flyweight/big" + charName + ".txt")
);
String line;
StringBuffer buf = new StringBuffer();
while ((line = reader.readLine()) != null) {
buf.append(line);
buf.append("\n");
}
reader.close();
this.fontData = buf.toString();
} catch (IOException e) {
this.fontData = charName + "?";
}
}
public void print() {
System.out.println(fontData);
}
}
// 生成 BigChar 实例的工厂,实现了共享实例的功能。
public class BigCharFactory {
// 管理已经生成的 BigChar 的实例
private Map<String, BigChar> pool = new HashMap<>();
private static BigCharFactory singleton = new BigCharFactory();
private BigCharFactory() {
}
public static BigCharFactory getInstance() {
return singleton;
}
public synchronized BigChar getBigChar(char charName) {
BigChar bigChar = pool.get(charName);
if (bigChar == null) {
bigChar = new BigChar(charName);
pool.put("" + charName, bigChar);
}
return bigChar;
}
}
// 由 BigChar 组成的字符串
public class BigString {
// 大型字符的数组
private BigChar[] bigChars;
public BigString(String string) {
this.bigChars = new BigChar[string.length()];
BigCharFactory factory = BigCharFactory.getInstance();
for (int i = 0; i < bigChars.length; i++) {
bigChars[i] = factory.getBigChar(string.charAt(i));
}
}
public void print() {
for (int i = 0; i < bigChars.length; i++) {
bigChars[i].print();
}
}
}
public class Main {
public static void main(String[] args) {
BigString bigString = new BigString("12321");
bigString.print();
}
}
结果
要点
将那些真正应该在多个地方共享的定义为 Flyweight。