Sobes.tech
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());