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()); - Будівельник (Builder): Дозволяє створювати складні об'єкти поетапно. Дає можливість використовувати один і той самий процес побудови для отримання різних представлень об'єкта.
// Інтерфейс будівельника class Builder { producePartA() { } producePartB() { } producePartC() { } } // Конкретний будівельник class ConcreteBuilder1 extends Builder { constructor() { super(); this.reset(); } reset() { this.product = new Product1(); } producePartA() { this.product.parts.push('ЧастинаA1'); } producePartB() { this.product.parts.push('ЧастинаB1'); } producePartC() { this.product.parts.push('ЧастинаC1'); } getProduct() { const result = this.product; this.reset(); return result; } } // Представлений продукт class Product1 { constructor() { this.parts = []; } listParts() { console.log(`Частини продукту: ${this.parts.join(', ')}`); } } // Режисер (необов'язковий, керує процесом побудови) class Director { setBuilder(builder) { this.builder = builder; } buildMinimalViableProduct() { this.builder.producePartA(); } buildFullFeaturedProduct() { this.builder.producePartA(); this.builder.producePartB(); this.builder.producePartC(); } } // Використання const director = new Director(); const builder = new ConcreteBuilder1(); director.setBuilder(builder); console.log('Стандартний мінімальний продукт:'); director.buildMinimalViableProduct(); builder.getProduct().listParts(); console.log('Стандартний повнофункціональний продукт:'); director.buildFullFeaturedProduct(); builder.getProduct().listParts(); console.log('Користувацький продукт:'); builder.producePartA(); builder.producePartC(); builder.getProduct().listParts(); - Прототип (Prototype): Дозволяє копіювати існуючі об'єкти, не вдаючись у подробиці їх реалізації.
// Інтерфейс прототипу class Prototype { clone() { throw new Error("Метод має бути реалізований підкласами"); } } // Конкретний прототип class ConcretePrototype1 extends Prototype { constructor(property) { super(); this.property = property; } clone() { const clone = new ConcretePrototype1(this.property); // Можна додати глибоке копіювання інших властивостей за потреби return clone; } } // Використання const original = new ConcretePrototype1("значення"); const clone = original.clone(); console.log(`Оригінал property: ${original.property}`); console.log(`Клон property: ${clone.property}`); // Перевірка, що це різні об'єкти console.log(`Рівність об'єктів? ${original === clone}`); - Одинак (Singleton): Гарантує, що у класу є лише один екземпляр, і надає до нього глобальну точку доступу.
class Singleton { static instance; constructor() { if (Singleton.instance) { return Singleton.instance; } Singleton.instance = this; } someBusinessLogic() { // ... } } // Використання const s1 = new Singleton(); const s2 = new Singleton(); console.log(`Однакові екземпляри? ${s1 === s2}`);