1. Flyweight模式
也称享元模式,共享对象,避免浪费。在应当共享的信息和不应当共享的信息也有两个专业名词。
名词 | 描述 |
---|---|
Intrinsic信息 | 固有的,不依赖位置与状况,可以共享 |
Extrinsic信息 | 非固有的,依赖位置与状况,不可以共享 |
在使用享元模式时要注意不要让被共享的实例被垃圾回收器回收了
1.1 Flyweight模式的类图
登场角色
-
Flyweight(轻量级)
被共享的类 -
FlyweightFactory(轻量级工厂)
生成Flyweight角色的工厂 -
Client(请求者)
使用Flyweight者
1.2 示例程序
类一览表
名字 | 说明 |
---|---|
BigChar | 表示“大字符”类,也是要被共享的类 |
BigCharFactory | 表示生成“大字符”的工厂类 |
BigString | 有“大字符”组成的字符串 |
Mian | 测试类 |
uml类图
类目录
big0.txt
big1.txt
BigChar类
package xin.ajay.flyweight;
import java.io.*;
public class BigChar {
private char charname;
private String fontdata;
public BigChar(char charname) {
this.charname = charname;
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(this.getClass().getClassLoader().getResourceAsStream("big" + charname + ".txt")));
StringBuilder builder = new StringBuilder();
String line;
while ((line = reader.readLine())!=null){
builder.append(line);
builder.append("\n");
}
reader.close();
this.fontdata = builder.toString();
} catch (IOException e) {
e.printStackTrace();
}
}
public void print(){
System.out.println(fontdata);
}
}
BigCharFactory类
package xin.ajay.flyweight;
import java.util.HashMap;
import java.util.Map;
public class BigCharFactory {
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;
}
}
BigString类
package xin.ajay.flyweight;
public class BigString {
private BigChar[] bigChars;
public BigString(String msg) {
this.bigChars = new BigChar[msg.length()];
BigCharFactory factory = BigCharFactory.getInstance();
for (int i = 0; i < bigChars.length; i++) {
bigChars[i] = factory.getBigChar(msg.charAt(i));
}
}
public void print(){
for (int i = 0; i < bigChars.length; i++) {
bigChars[i].print();
}
}
}
Main类
package xin.ajay.flyweight;
public class Main {
public static void main(String[] args) {
if(args.length==0){
System.out.println("Usage: java Main digits");
System.out.println("Example: java Main 0202");
System.exit(0);
}
BigString bigString = new BigString(args[0]);
bigString.print();
}
}
结果
鸣谢:
GoF《设计模式》和结城浩的《图解设计模式》