【问题标题】:Flyweight pattern vs static fields享元模式与静态字段
【发布时间】:2013-02-23 13:49:26
【问题描述】:

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

考虑以下示例: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 对象的引用,从而实现了相同的目标。我错了吗?

【问题讨论】:

  • 因为你有几个共享状态?我不确定我是否理解这个问题。您可能需要提供示例代码来说明您的意思。

标签: design-patterns flyweight-pattern


【解决方案1】:

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

【讨论】:

  • 换句话说,享元充当许多对象引用的“原型”以节省内存
  • 如果您有不同图形表示的静态集合怎么办?这种模式对我来说似乎很复杂,更像是一种反模式
  • 那么每个士兵都会引用这个静态集合的图形表示之一。假设列表大小为 5,士兵人数为 1,000,000,您将有 5 个图形表示实例,而不是 1,000,000。这就是模式的重点。
  • SoilderClient mySoldier = new SoilderClient(SolderClient.GraphicalRepresentationCollection["smallRed"]) 怎么样?在施工时或任何后期阶段的 mySolder.SetGraphicalRepresentation(SolderClient.GraphicalRepresentationCollection["smallRed"])?
  • 是的,就是这样。您刚刚使用了享元模式。不使用它将是SoldierClient mySoldier = new SoldierClient(new SmallRedGraphicalRepresentation());
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多