Вопрос проверяет понимание различий между двумя порождающими паттернами проектирования: Фабрика (Factory) и Фабричный метод (Factory Method).
Паттерны Фабричный метод (Factory Method) и Фабрика (Factory) часто путают, хотя они решают разные задачи. Оба относятся к порождающим паттернам, но отличаются уровнем абстракции и способом делегирования создания объектов.
Этот паттерн определяет интерфейс для создания одного объекта, но позволяет подклассам решать, какой конкретный класс инстанцировать. Он использует наследование: базовый класс объявляет метод-фабрику, а подклассы его переопределяют.
abstract class Document {
abstract createPage(): Page;
open() {
const page = this.createPage();
page.render();
}
}
class Resume extends Document {
createPage(): Page {
return new SkillPage();
}
}Паттерн Фабрика предоставляет интерфейс для создания семейств взаимосвязанных объектов. Он использует композицию: клиент получает объект-фабрику и вызывает его методы для создания продуктов.
interface GUIFactory {
createButton(): Button;
createCheckbox(): Checkbox;
}
class WinFactory implements GUIFactory {
createButton(): Button { return new WinButton(); }
createCheckbox(): Checkbox { return new WinCheckbox(); }
}Используйте Фабричный метод, когда нужно делегировать создание одного объекта подклассам, и Фабрику, когда требуется создавать группы связанных объектов, гарантируя их совместимость.