Flyweight模式与静态字段

时间:2013-02-23 13:49:26

标签: design-patterns flyweight-pattern

根据我的理解,flyweight模式的目的是通过共享共同的外在状态来减少内存占用并提高性能。为什么有人宁愿在静态字段中存储共享状态来实现模式呢?

请考虑以下示例:http://www.oodesign.com/flyweight-pattern-wargame-example-java-sourcecode.html

enter image description here

如果我是对的,那么本例中的要点是通过保持对单个SoldierImp对象的引用来共享SoldierClient类的所有实例之间的公共状态(soldierGraphicalRepresentation对象)。

为什么我会为实施这个设计而烦恼?我很想宣布SoldierClient类如下:

public class SoldierClient implements Soldier 
{
    protected static Object soldierGraphicalRepresentation;
    private int currentLocationX;
    private int currentLocationY;

    static SoldierImp()
    {
        soldierGraphicalRepresentation = LoadGraphicalRepresentation();
    }

    public void moveSoldier(int previousLocationX, int previousLocationY, int newLocationX, int newLocationY) {
        // do stuff with the graphical representation

    }
}

这样,SoilderClient的所有实例都共享对同一个soldierGraphicalRepresentation对象的引用,并实现了相同的目标。我错了吗?

2 个答案:

答案 0 :(得分:10)

模式的关键在于你可以让200名“大红色”士兵共享相同的“大红色”图形表示,300名“小蓝”士兵共享相同的“小蓝”图形表示等。如果你制作图形表示静态,所有士兵都是相同的。

答案 1 :(得分:2)

静态字段有效,无论您有多少红/绿/蓝图形表示。静态字段的唯一问题是它们违反了单一责任原则。如您所见,您的SoldierClient课程有两个工作:

  1. 管理图形表示池
  2. 典型SoldierClient
  3. 的工作

    使用这种设计,在另一个环境中重复使用这两个作业中的一个是非常困难的。例如,对于也需要共享图形表示的Monster对象,池不能重用;典型的SoldierClient不能在与池无关的另一个上下文中使用。