1

我正在尝试在生成云的程序中应用享元模式。我有一个代表云的内在状态的类。云类型由其属性定义:

class CloudType {
    float size;
    float altitude;
    String color;
    String texture;

   public void display(x, y) {}

}

class ConcreteCloud {
    float x;
    float y;
    CloudType cloudType;

    void display() {
        cloudeType.display(x, y);
    }
}

我想创建一个 CloudType 工厂,它将这些特征作为参数并返回 CloudType 的相应实例(如果存在),否则预先创建并存储它。

class CloudTypeFactory {
    //  SomeContainer<CloudType> container;

    public CloudType getCloudType(float size, float altitude, String color, String texture) {
        CloudType instance = // container get corresponding cloudType
        if (instance == null) {
            instance = new CloudeType(size, altitude, color, texture);
            container.add(instance);
        }
        return instance;
    }

}

问题:

我对使用哪个容器以及架构本身有疑问。可以使用 HashSet,但搜索复杂性与 CloudType 中的属性数量成正比,这似乎不正确。在我在线阅读的示例中,作者使用 HashMap,其键是 CloudType 的名称:这违背了 IMO 的目的,因为在这种情况下可能有无限数量的云类型。

4

2 回答 2

0
  1. 为类实现equals()和,以便您可以在 Map 中存储实例。hashCode()CloudType
  2. 使用哈希码作为键。
  3. 实现哈希码算法,以便您可以将sizealtitudecolor和传递texture给它。
  4. 使用四个参数生成哈希键以查找CloudType.

像这样的东西。

class CloudType {
    float size;
    float altitude;
    String color;
    String texture;

    private static final Map<Integer, CloudType> CACHE = new HashMap<>();

    private CloudType(float size, float altitude, String color, String texture) {
        this.size = size;
        this.altitude = altitude;
        this.color = color;
        this.texture = texture;
    }

    public static CloudType lookup(float size, float altitude, String color, String texture) {
        int hashKey = hashCode(size, altitude, color, texture);
        return CACHE.computeIfAbsent(hashKey, k -> new CloudType(size, altitude, color, texture));
    }

    public void display(float x, float y) {}

    //TODO generate equals() method

    @Override
    public int hashCode() {
        return hashCode(size, altitude, color, texture);
    }

    private static int hashCode(float size, float altitude, String color, String texture) {
        return Objects.hash(size, altitude, color, texture);
    }
}
于 2020-05-27T13:20:47.833 回答
0

您在为享元设计适当的关联存储时遇到的问题可能表明您的情况可能不是享元模式的好目标。特别是,对象的两个固有状态是浮点值。这是不寻常的。在实践中,这意味着您可以拥有无​​限多的物体,它们的高度或大小差异很小。

您设计的解决方案应取决于此数据建模的实际需求,以及CloudTypes客户端代码重用的程度。如果因为浮点精度实际上很重要而不重用它们,那么享元就不合适。相反,如果在实践中只使用有限数量的sizealtitude值,那么将这些值离散化并使用它们来构造一个主键以在关联存储中使用是有意义的。

于 2020-06-10T14:25:21.447 回答