7

据我了解,享元模式的目的是通过共享通用的外部状态来减少内存占用并提高性能。为什么有人更愿意实现模式而不是将共享状态存储在静态字段中?

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

在此处输入图像描述

如果我是对的,那么此示例中的重点是通过持有对单个 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 的所有实例共享对同一个 solderGraphicalRepresentation 对象的引用,从而实现了相同的目标。我错了吗?

4

2 回答 2

11

该模式的要点是,您可以让 200 个“大红”士兵共享相同的“大红”图形表示,300 个“小蓝”士兵共享相同的“小蓝”图形表示,等等。如果您制作图形表示静态的,所有的士兵都是一样的。

于 2013-02-23T14:42:33.997 回答
3

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

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

使用这种设计,很难在另一个上下文中重用这两个作业中的一个。例如,池不能被Monster同样需要共享图形表示的对象重用;典型的SoldierClient不能用于与池无关的另一个上下文中。

于 2016-10-12T10:00:23.957 回答