Соответствующая структура данных для наилегчайшего веса - PullRequest
1 голос
/ 27 мая 2020

Я пытаюсь применить шаблон легковеса в программе, которая генерирует облака. У меня есть класс, который представляет внутренние c состояния облаков. Тип облака определяется его атрибутами:

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, поскольку в этом случае может быть бесконечное количество типов облаков.

Ответы [ 2 ]

0 голосов
/ 10 июня 2020

Проблемы, с которыми вы сталкиваетесь при разработке правильного ассоциативного магазина для легковесов, могут быть признаком того, что ваша ситуация не может быть хорошей целью для шаблона наилегчайшего веса. В частности, две части внутреннего состояния c объектов являются значениями с плавающей запятой. Это необычно. На практике это означает, что у вас может быть бесконечное количество объектов с бесконечно малыми различиями в их высоте или размере.

Проектируемое вами решение должно зависеть от фактической потребности в этом моделировании данных и от того, в какой степени CloudTypes повторно используется клиентским кодом. Если они не повторно используются, потому что точность с плавающей запятой действительно имеет значение, тогда Легковес не подходит. Напротив, если на практике используется только ограниченное количество значений size и altitude, тогда имеет смысл дискретизировать эти значения и использовать их для создания первичного ключа для использования в ассоциативном хранилище.

0 голосов
/ 27 мая 2020
  1. Реализуйте equals() и hashCode() для класса CloudType, чтобы вы могли хранить экземпляры в Map.
  2. Используйте код ha sh в качестве ключа.
  3. Реализуйте алгоритм кода ha sh, чтобы вы могли передать ему size, altitude, color и texture.
  4. Используйте четыре аргумента для генерации ha sh, чтобы найти 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...