Ответ Грегори Вейра - мой любимый, как структурировать экземпляры предметов для выполнения нескольких ролей.
Чтобы загрузить из файла:
Во-первых, используйте YAML. YAML - это язык описания данных; он может быть проанализирован относительно быстро, прочитан и отредактирован людьми, поддерживает двоичные данные, и библиотеки существуют для большинства языков программирования, включая Java. Это решает "как мне получить данные из файлов в объекты?"
Во-вторых, используйте шаблон flyweight . Большая часть данных, которые вы читаете из этих файлов, является статической. Он не будет меняться в каждом случае («топор наносит 1d10 базового урона и разбивает дерево, но не камень» - это верно для всех пяти топоров, которые есть у игрока). На самом деле вы читаете из файлов YAML эти платонические определения, и ваши индивидуальные экземпляры имеют неопознанные (и постоянные) ссылки на них, а также данные для каждого экземпляра, такие как «Сколько качаний до того, как я сломался?», «Игрок дал мне нестандартное имя? »и так далее.
Обмениваясь данными между экземплярами в одном объекте, вы сохраняете много памяти и облегчаете обновление элементов без сохранения состояния игры (сохранение игр или базы данных игроков).
Итак, ваша структура классов выглядит примерно так:
- Класс Item - один экземпляр на элемент
- Владеет оружейным экземпляром
- Owns-a Tool экземпляр
- Имеет - нестандартное имя и т. Д.
- Оружие класса - (до) один экземпляр за предмет
- Is-a ItemComponent
- Относится к WeaponDef
- Имеет бонусный уровень зачарования и т. Д.
- Инструмент класса - (до) один экземпляр на элемент
- Is-a ItemComponent
- Относится к ToolDef
- Имеет - долговечность и т. Д.
- Класс WeaponDef - один экземпляр для каждого вида оружия
- Чтение из файла, поля должны быть постоянными.
- Имеет базовое количество урона, 1 или 2 руки и т. Д.
- класс ToolDef - один экземпляр для каждого вида инструмента
- Чтение из файла, поля должны быть постоянными.
- Имеет базовую прочность, материалы, которые он может сломать и т. Д.