Я хочу иметь объекты с рядом свойств и одним уникальным идентифицирующим ключом. Поскольку ключ уникален, его можно использовать для выбора определенного набора свойств. Я хочу иметь возможность использовать ключ при создании экземпляра объекта, чтобы свойства, связанные с этим ключом, становились атрибутами этого объекта.
Спецификация свойства будет регулярной (т. Е. Если один ключ имеет свойство с именем description, то так же будет и с любым другим ключом).
Плохой пример
Этот пример - то, как я сначала попытался подойти к проблеме, и этого недостаточно. Я размещаю это здесь, чтобы проиллюстрировать проблемы с этим подходом
Я мог бы иметь класс Food, который имеет атрибуты name и description. В этом случае предполагается, что имя является уникальным ключом, в данном случае просто описанием.
public class Food {
private String name;
private String description;
public Food(String name, String description) {
this.name = name;
this.description = description;
}
}
Проблемы с этим подходом
Во-первых, всякий раз, когда я создаю особый вид пищи, скажем, пиццу, мне приходилось каждый раз вводить одно и то же описание, например «Популярное итальянское блюдо». Я бы предпочел, чтобы у меня была возможность создать объект, зная только название еды, а затем заполнить остальные атрибуты для меня. Другими словами, я должен быть в состоянии просто передать пиццу, и объект будет создан с соответствующим описанием.
Во-вторых, в этом примере нет гарантированной уникальности для атрибута name. Я мог бы создать пиццу с описанием «Популярного итальянского блюда», а другую - с описанием «Сырного добра»! Однако я хочу, чтобы имя однозначно выбрало набор атрибутов. Конечно, атрибут может принадлежать нескольким ключам (пицца и паста могут иметь описание «итальянского блюда»), но ключ может иметь только конкретное описание.
Потенциальные решения
Я предполагаю, что для этого потребуется как минимум 2 вещи:
Какой-то способ связать имя с набором атрибутов. HashMap кажется идеальным для этого, но где было бы хорошее место для его хранения? Кажется очень странным помещать его в класс Food.
Некоторый создающий класс, который обрабатывает создание объектов Food (возможно, это было бы хорошим местом для вышеупомянутого HashMap?) Я изучал шаблоны Factory и Builder, но Factory, кажется, для создания разные подклассы, и я хочу иметь возможность хранить тысячи разных имен элементов (а не создавать тысячи разных подклассов). Кажется, что Builder предназначен для определения всех атрибутов объекта более простым способом, чем запоминание порядка параметров в конструкторе, и в то же время гарантирует, что объект не может быть создан на полпути, но это, кажется, почти противоположно тому, что я ищу.