JavaFlyweight模式
本文最后更新于:1 年前
共享对象,避免浪费
1 - 表示”大型字符”的类
public class BigChar {
// 字符名字
private char charName;
// 大型字符对应的字符串(由'#''.''\n'组成)
private String fontData;
private String filePath = "大型字符文件路径";
// 构造函数
public BigChar(char charName) {
this.charName = charName;
try {
BufferedReader reader = new BufferedReader(
new FileReader(filePath+ "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 + "?";
e.printStackTrace();
}
}
// 显示大型字符
public void print() {
System.out.println(fontData);
}
}
需要提前准备大型字符文件
例如字符’1’ ,文件名以”big1.txt”为标准
..................
........##........
....######........
........##........
........##........
........##........
........##........
..##############..
..................
2 - 表示生成和共用BigChar类的实例的类
public class BigCharFactory {
// 管理已经生成的BigChar的实例
private HashMap<String, BigChar> pool = new HashMap<>();
// Singleton模式
private static BigCharFactory singleton = new BigCharFactory();
// 构造函数
private BigCharFactory() {}
// 获取唯一实例
public static BigCharFactory getInstance() {
return singleton;
}
// 生成(共享)BigChar类的实例
public synchronized BigChar getBigChar(char charName) {
BigChar bc = pool.get("" + charName);
if (bc == null) {
bc = new BigChar(charName);
pool.put("" + charName, bc);
}
return bc;
}
}
3 - 表示多个BigChar组成的”大型字符串”的类
public class BigString {
// "大型字符"的数组
private BigChar[] bigChars;
// 构造函数
public BigString(String string) {
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 (BigChar bigChar : bigChars) {
bigChar.print();
}
}
}
4 - 测试程序行为的类
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 1212123");
System.exit(0);
}
BigString bs = new BigString(args[0]);
bs.print();
}
}
需要提前设置参数 args[0] = ‘12123’
5 - 输出示例
..................
........##........
....######........
........##........
........##........
........##........
........##........
..##############..
..................
...................
....########.......
..##.........###...
............###....
..........###......
........###........
......###..........
....###............
..#############....
...................
..................
........##........
....######........
........##........
........##........
........##........
........##........
..##############..
..................
...................
....########.......
..##.........###...
............###....
..........###......
........###........
......###..........
....###............
..#############....
...................
..................
....#######.......
..##.......##.....
............##....
....#######.......
............##....
..##.......##.....
....######........
..................
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!