Для расширения без изменения фабрики используйте реестр Supplier<Shape>. Новый Pentagon подключается регистрацией поставщика; сам факт появления класса не делает его автоматически обнаружимым.
Реализация паттерна Abstract Factory для создания фигур
Для расширения без изменения фабрики используйте реестр Supplier<Shape>. Новый Pentagon подключается регистрацией поставщика; сам факт появления класса не делает его автоматически обнаружимым.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо реализовать паттерн проектирования Abstract Factory, позволяющий получать объекты, реализующие интерфейс Shape. Метод getInstance() должен возвращать экземпляр требуемой фигуры. При этом решение должно быть спроектировано так, чтобы легко добавлять новые типы фигур без изменения существующего кода. Например, после добавления класса Pentagon, реализующего Shape, фабрика должна без доработок уметь создавать его экземпляры. В текущем проекте уже присутствуют реализации фигур Cube и Triangle.
public class ShapeFactory {
}
Ответ
Для расширения без изменения фабрики используйте реестр Supplier<Shape>. Новый Pentagon подключается регистрацией поставщика; сам факт появления класса не делает его автоматически обнаружимым.
public class ShapeFactory {
private final Map<String, java.util.function.Supplier<Shape>> creators;
public ShapeFactory(Map<String, java.util.function.Supplier<Shape>> creators) {
this.creators = Map.copyOf(creators);
}
public Shape getInstance(String type) {
var creator = creators.get(type);
if (creator == null) throw new IllegalArgumentException("Unknown shape");
return creator.get();
}
}
Конфигурация: Map.of("cube", Cube::new, "triangle", Triangle::new); новая фигура добавляется там или через ServiceLoader/DI. Это registry factory, не классическая Abstract Factory семейств связанных продуктов. Без параметра, конфигурации или отдельной фабрики getInstance не может знать требуемый тип фигуры.