bboyjing's blog

HeadFirst设计模式十九【蝇量模式】

蝇量模式也叫享元模式,作用是让某个类的一个实例能用来提供许虚拟示例,也就是说节省内存。

场景描述

假设现在在设计一个景观系统,要想在其中加上一些树做点缀。树有一个XY坐标位置,而且可以根据树的年龄动态地将自己绘制出来。问题是,用户可能要在景观中设计非常非常多的树,有可能会让程序变得运行缓慢。下面看下蝇量模式如何解决这个问题。

代码示例

蝇量的解决思路是只用一个树的实例和一个客户对象来维护所有树的状态。

  1. 构建一个没有状态的树对象

    1
    2
    3
    4
    5
    6
    7
    public class Tree {
    public static void display(int x, int y, int age) {
    System.out.println("X : " + x);
    System.out.println("y : " + y);
    System.out.println("Age : " + age);
    }
    }
  2. 创建一个管理者,拥有所有虚拟树的状态

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class TreeManager {
    int[][] treeArray;
    public TreeManager() {
    this.treeArray = new int[][]{{111, 222, 10}, {4565, 32321, 25}, {981, 341, 101}};
    }
    public void displayTrees() {
    for (int[] tree : treeArray) {
    Tree.display(tree[0], tree[1], tree[2]);
    }
    }
    }
  3. 测试

    1
    2
    3
    4
    5
    6
    public class Test {
    public static void main(String[] args) {
    TreeManager treeManager = new TreeManager();
    treeManager.displayTrees();
    }
    }

蝇量或者叫享元模式,是通过二维数组保存所有树状态的形式来虚拟化所有的树,这样就不需要真实地创建那么多的树实例出来了。这个模式看上去也不复杂,本章节就到这里了。