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 协议 ,转载请注明出处!