В настоящее время я работаю над проектом, в котором пытаюсь скрыть как можно больше подробностей об иерархии, которую я создал.Я хочу сделать это, чтобы минимизировать объем информации, которую пользователь должен знать об объектах (и контролировать, что они могут делать с состоянием объекта).Кроме того, я использую этот шаблон, чтобы ограничить типы объектов, которые может создавать приложение, и ограничить его созданием на заводе.
Однако основная проблема, с которой я сталкиваюсь, заключается в том, что существует несколькоразные виды интерфейсов я бы хотел выставить.Каждый интерфейс имеет дополнительную функциональность, которую я не считаю общей, и я хотел бы разделить эти интерфейсы.Наконец, я не знаю, какие новые интерфейсы могут появиться в будущем, но я хотел бы попробовать и быть готовым к ним.
Weapon
:
public interface Weapon extends GameObject {
Number attack();
boolean addWeaponAttribute(WeaponAttribute attribute);
}
Firearm
:
public interface Firearm extends Weapon {
void reload(Number rounds);
}
Мой вопрос: каков наилучший способ заставить фабрику производить объекты с различными интерфейсами?Вот что я считаю «лучшим будет»:
- Наиболее понятным для пользователя (очевидно, о чем они просят и что получают)
- Лучшее для будущего расширения (я не уверен, какие новые интерфейсы я добавлю к этой системе).
Вот что я думал до сих пор:
Создание правильно названных методов длякаждый интерфейс
public static Firearm getFirearm(String firearmName) {
...
}
public static Weapon getWeapon(String weaponName) {
...
}
Делайте выше, но производите фабрики в отдельно названных классах
public class WeaponFactory {
public static Weapon getWeapon(String weaponName) {
...
}
}
public class FirearmFactory {
public static Firearm getFirearm(String firearmName) {
...
}
}
Что-то совершенно другое
Я открыт для предложений и изменений,Это гибкий проект, поэтому я могу изменить столько, сколько захочу (с точки зрения этой части проекта), чтобы добиться лучшего результата.
Кроме того - Как примечание, я не был уверен, что этовопрос был слишком открытым или нет для SO.Если я ошибся, разместив здесь сообщение, дайте мне знать, и я перенесу свой вопрос в другое место.