当某个类的一个实例可以用于提供许多虚拟实例时,使用亨元模式。
假设一个使用场景假设在一个景观设计应用中,需要添加一些树作为对象,树有一个XY位置,并根据年龄来绘制自己。
此时面临的困境:
有一个大客户,打算用这个软件进行景观设计,但是在使用一周之后(创建了很多树),此时发现软件变卡,对象过多,占用内存大。
解决方案使用一棵树来表示上面所有的树,也就是只有一个实例来维护所有树的客户对象,这就是亨元模式。
由于树只有三个变量,X坐标、Y坐标与树的年龄,所以可以创建一个树的管理器,这个管理器有个数组,数组保存这些信息,然后调用同一个对象进行创建。
树场景的类图 树场景的代码设计public class Tree {
private int x;
private int y;
private int age;
public Tree(int x, int y, int age) {
this.x = x;
this.y = y;
this.age = age;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void display(){
System.out.println(x + " " + y + " " + age);
}
}
public class TreeManager {
private List treeArray;
public TreeManager() {
this.treeArray = new ArrayList<>();
}
public void addTree(Tree tree){
if (!treeArray.contains(tree)){
treeArray.add(tree);
}
}
public void removeTree(Tree tree){
if(treeArray.contains(tree)){
treeArray.remove(tree);
}
}
public void displayTrees(){
for (Tree t:treeArray) {
t.display();
}
}
}
亨元模式优点
减少运行时对象实例的数目,节省内存。
把许多虚拟对象的状态集中放在一个地方。
亨元模式的用途和缺点当一个类有许多实例时,而这些实例能够用一致的方法控制时,用亨元。
缺点在于,一旦实现,这个类的单独实例,无法用于与其它实例不同的独立行为。



