
Паттерны проектирования в JavaScript 2026: GoF, SOLID, GRASP с примерами
вторник, 20 января 2026 г.
В современной разработке на JavaScript невозможно писать качественный и масштабируемый код без понимания классических подходов к проектированию. Три наиболее важных набора идей - это паттерны GoF (Gang of Four), принципы SOLID и GRASP. Они помогают структурировать логику, снижать связанность и делать систему гибкой.
GoF - это 23 классических паттерна, описанных в книге "Design Patterns" 1994 года. В JavaScript многие из них реализуются проще благодаря динамической типизации, замыканиям и классам ES6.
Самые популярные GoF-паттерны в JS:
- Singleton - единственный экземпляр класса
- Factory Method / Abstract Factory - создание объектов без указания точного класса
- Observer (Publisher-Subscriber) - реакция на изменения
- Decorator - динамическое добавление поведения
- Strategy - выбор алгоритма на лету
- Module / Revealing Module - инкапсуляция (самый частый в JS)
Пример Singleton в современном JavaScript:
const Singleton = (function () {
let instance;
function createInstance() {
const obj = { name: "Единый экземпляр" };
return obj;
}
return {
getInstance: function () {
if (!instance) {
instance = createInstance();
}
return instance;
}
};
})();
const s1 = Singleton.getInstance();
const s2 = Singleton.getInstance();
console.log(s1 === s2); // true
Принципы SOLID помогают писать поддерживаемый объектно-ориентированный код. Они особенно полезны в крупных проектах и при использовании TypeScript.
- S - Single Responsibility Principle (единственная ответственность)
- O - Open-Closed Principle (открыт для расширения, закрыт для модификации)
- L - Liskov Substitution Principle (принцип подстановки Барбары Лисков)
- I - Interface Segregation Principle (разделение интерфейсов)
- D - Dependency Inversion Principle (инверсия зависимостей)
Пример нарушения и соблюдения SRP:
// Нарушение SRP
class UserService {
createUser(data) { /* ... */ }
sendEmail(user) { /* ... */ }
saveToDatabase(user) { /* ... */ }
}
// Соблюдение SRP
class UserRepository {
save(user) { /* ... */ }
}
class EmailService {
sendWelcome(user) { /* ... */ }
}
class UserService {
constructor(userRepo, emailService) {
this.userRepo = userRepo;
this.emailService = emailService;
}
createUser(data) {
const user = /* создание */;
this.userRepo.save(user);
this.emailService.sendWelcome(user);
}
}
GRASP (General Responsibility Assignment Software Patterns) - это набор рекомендаций, как правильно распределять обязанности между объектами. Они дополняют GoF и SOLID.
Основные GRASP-принципы:
- Information Expert - ответственность у того, у кого есть нужные данные
- Creator - кто создает объект (обычно тот, кто его содержит)
- Controller - объект, координирующий сценарий (часто UI-слой или сервис)
- Low Coupling - низкая связанность
- High Cohesion - высокая связность внутри модуля
- Polymorphism - используй полиморфизм вместо if-else
- Indirection - промежуточный объект для снижения связанности
- Protected Variations - защита от изменений
Пример Information Expert + Creator в JS:
class Order {
constructor(customer, items) {
this.customer = customer;
this.items = items;
}
getTotal() {
return this.items.reduce((sum, item) => sum + item.price, 0);
}
}
class Customer {
constructor(name) {
this.name = name;
this.orders = [];
}
placeOrder(items) {
const order = new Order(this, items); // Creator
this.orders.push(order);
return order;
}
getTotalSpent() {
// Information Expert
return this.orders.reduce((sum, order) => sum + order.getTotal(), 0);
}
}
Осознанное применение GoF, SOLID и GRASP делает код чище, тестируемее и готовым к изменениям. В JavaScript особенно важно сочетать эти идеи с функциональным подходом и модульностью.

Александр
Fullstack-разработчик в МосквеПрофессиональная разработка веб-приложений на Node.js с использованием современных frontend и backend фреймворков. Создание, продвижение, поддержка и обслуживание сайтов. Эффективно, прибыльно.