Поиск по сайту
Ctrl + K
Вопросы по TS

Что такое паттерны проектирования?

Паттерны проектирования — это проверенные решения распространённых проблем, которые возникают при проектировании программного обеспечения. Они помогают разработчикам создавать гибкие, модульные и удобные для сопровождения архитектуры приложений. Паттерны проектирования делятся на три основные категории: порождающие, структурные и поведенческие.

1. Порождающие паттерны

Эти паттерны касаются создания объектов и могут помочь в создании универсальных систем, которые легко адаптируются к изменениям. Примеры:

  • Singleton — гарантирует, что у класса есть только один экземпляр и предоставляет к нему глобальную точку доступа.
class Singleton {
    private static instance: Singleton;

    private constructor() {}

    public static getInstance(): Singleton {
        if (!Singleton.instance) {
            Singleton.instance = new Singleton();
        }
        return Singleton.instance;
    }
}

// Использование
const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();
console.log(instance1 === instance2); // true
  • Factory Method — определяет интерфейс для создания объектов, но позволяет подклассам изменять тип создаваемого объекта.
interface Product {
    operation(): string;
}

class ConcreteProductA implements Product {
    public operation(): string {
        return 'Результат работы ConcreteProductA';
    }
}

class ConcreteProductB implements Product {
    public operation(): string {
        return 'Результат работы ConcreteProductB';
    }
}

abstract class Creator {
    public abstract factoryMethod(): Product;

    public someOperation(): string {
        const product = this.factoryMethod();
        return `Creator: Вы создали ${product.operation()}`;
    }
}

class ConcreteCreatorA extends Creator {
    public factoryMethod(): Product {
        return new ConcreteProductA();
    }
}

class ConcreteCreatorB extends Creator {
    public factoryMethod(): Product {
        return new ConcreteProductB();
    }
}

// Использование
const creatorA = new ConcreteCreatorA();
console.log(creatorA.someOperation()); // Creator: Вы создали Результат работы ConcreteProductA

const creatorB = new ConcreteCreatorB();
console.log(creatorB.someOperation()); // Creator: Вы создали Результат работы ConcreteProductB

2. Структурные паттерны

Структурные паттерны помогают организовать классы и объекты в более крупные структуры. Примеры:

  • Adapter — позволяет объектам с несовместимыми интерфейсами работать вместе.
class Adaptee {
    public specificRequest(): string {
        return 'Специфический запрос';
    }
}

class Target {
    public request(): string {
        return 'Стандартный запрос';
    }
}

class Adapter extends Target {
    private adaptee: Adaptee;

    constructor(adaptee: Adaptee) {
        super();
        this.adaptee = adaptee;
    }

    public request(): string {
        return `Адаптер: ${this.adaptee.specificRequest()}`;
    }
}

// Использование
const adaptee = new Adaptee();
const adapter = new Adapter(adaptee);
console.log(adapter.request()); // Адаптер: Специфический запрос

3. Поведенческие паттерны

Эти паттерны определяют, как объекты взаимодействуют друг с другом. Примеры:

  • Observer — устанавливает зависимость "один ко многим" между объектами, так что когда один объект изменяет своё состояние, все зависимые объекты уведомляются.
interface Observer {
    update(message: string): void;
}

class ConcreteObserver implements Observer {
    private name: string;

    constructor(name: string) {
        this.name = name;
    }

    public update(message: string): void {
        console.log(`Уведомление для ${this.name}: ${message}`);
    }
}

class Subject {
    private observers: Observer[] = [];

    public attach(observer: Observer) {
        this.observers.push(observer);
    }

    public notify(message: string) {
        for (const observer of this.observers) {
            observer.update(message);
        }
    }
}

// Использование
const subject = new Subject();
const observerA = new ConcreteObserver('Объект A');
const observerB = new ConcreteObserver('Объект B');
subject.attach(observerA);
subject.attach(observerB);
subject.notify('Изменение состояния!');
// Уведомление для Объект A: Изменение состояния!
// Уведомление для Объект B: Изменение состояния!

Заключение

Паттерны проектирования — это мощные инструменты, которые могут значительно упростить разработку и улучшить качество кода. Понимание паттернов и их применение позволяет новичкам в сфере веб-разработки создавать более эффективные, масштабируемые и поддерживаемые приложения.