Middle
Түзүүчү үлгүлөрдү атаңыз.
sobes.tech AI
AIден жооп
- Фабричный метод (Factory Method): Определяет интерфейс для создания объектов, но позволяет подклассам решать, какой класс инстанцировать.
// Интерфейс фабрики class Creator { factoryMethod() { throw new Error("Метод должен быть реализован подклассами"); } anOperation() { const product = this.factoryMethod(); return `Creator: тажа логика, которая только что работала с ${product.operation()}`; } } // Конкретная фабрика, создающая ProductA class ConcreteCreatorA extends Creator { factoryMethod() { return new ConcreteProductA(); } } // Интерфейс продукта class Product { operation() { throw new Error("Метод должен быть реализован подклассами"); } } // Конкретный продукт, созданный ConcreteCreatorA class ConcreteProductA extends Product { operation() { return "Натый ConcreteProductA"; } } // Использование const creator = new ConcreteCreatorA(); console.log(creator.anOperation()); - Абстрактная фабрика (Abstract Factory): Предоставляет интерфейс для создания семейств связанных или зависимых объектов, не специфицируя их конкретные классы.
// Интерфейс абстрактной фабрики class AbstractFactory { createProductA() { throw new Error("Метод должен быть реализован подклассами"); } createProductB() { throw new Error("Метод должен быть реализован подклассами"); } } // Конкретная фабрика для создания продуктов Вариант 1 class ConcreteFactory1 extends AbstractFactory { createProductA() { return new ConcreteProductA1(); } createProductB() { return new ConcreteProductB1(); } } // Конкретная фабрика для создания продуктов Вариант 2 class ConcreteFactory2 extends AbstractFactory { createProductA() { return new ConcreteProductA2(); } createProductB() { return new ConcreteProductB2(); } } // Интерфейсы продуктов class AbstractProductA { operationA() { throw new Error("Метод должен быть реализован подклассами"); } } class AbstractProductB { operationB() { throw new Error("Метод должен быть реализован подклассами"); } anotherOperationB(collaborator) { throw new Error("Метод должен быть реализован подклассами"); } } // Конкретные продукты Вариант 1 class ConcreteProductA1 extends AbstractProductA { operationA() { return "Результат ConcreteProductA1"; } } class ConcreteProductB1 extends AbstractProductB { operationB() { return "Результат ConcreteProductB1"; } anotherOperationB(collaborator) { return `Результат ConcreteProductB1 совместно с ${collaborator.operationA()}`; } } // Конкретные продукты Вариант 2 class ConcreteProductA2 extends AbstractProductA { operationA() { return "Результат ConcreteProductA2"; } } class ConcreteProductB2 extends AbstractProductB { operationB() { return "Результат ConcreteProductB2"; } anotherOperationB(collaborator) { return `Результат ConcreteProductB2 совместно с ${collaborator.operationA()}`; } } // Использование function clientCode(factory) { const productA = factory.createProductA(); const productB = factory.createProductB(); console.log(productB.operationB()); console.log(productB.anotherOperationB(productA)); } console.log('Клиент: Тестирование Factory1...'); clientCode(new ConcreteFactory1()); console.log('Клиент: Тестирование Factory2...'); clientCode(new ConcreteFactory2());