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('PartA1'); } producePartB() { this.product.parts.push('PartB1'); } producePartC() { this.product.parts.push('PartC1'); } 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): უზრუნველყოფს, რომ კლასი იყოს მხოლოდ ერთი ინstanzი, და გლობალურ წვდომას აძლევს მას.
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}`);