Что такое паттерны проектирования?
Паттерны проектирования — это проверенные решения распространённых проблем, которые возникают при проектировании программного обеспечения. Они помогают разработчикам создавать гибкие, модульные и удобные для сопровождения архитектуры приложений. Паттерны проектирования делятся на три основные категории: порождающие, структурные и поведенческие.
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: Изменение состояния!
Заключение
Паттерны проектирования — это мощные инструменты, которые могут значительно упростить разработку и улучшить качество кода. Понимание паттернов и их применение позволяет новичкам в сфере веб-разработки создавать более эффективные, масштабируемые и поддерживаемые приложения.