Паттерны проектирования (Design Patterns) — это проверенные временем решения часто встречающихся проблем в проектировании программного обеспечения. Они представляют собой не готовый код, а шаблоны проектирования, которые можно адаптировать под конкретные нужды.
Решают: Проблемы создания объектов
Примеры:
// Пример Singleton в C++
class Database {
static Database* instance;
Database() {} // Приватный конструктор
public:
static Database* getInstance() {
if (!instance) instance = new Database();
return instance;
}
// Удаление копирования
Database(const Database&) = delete;
void operator=(const Database&) = delete;
};
Решают: Проблемы композиции классов и объектов
Примеры:
// Пример Adapter
class LegacySystem {
public:
void oldProcess(int x) { /*...*/ }
};
class NewInterface {
public:
virtual void process(int x) = 0;
};
class Adapter : public NewInterface {
LegacySystem legacy;
public:
void process(int x) override {
legacy.oldProcess(x); // Адаптация интерфейса
}
};
Решают: Проблемы взаимодействия объектов
Примеры:
// Пример Strategy
class SortStrategy {
public:
virtual void sort(std::vector<int>&) = 0;
};
class QuickSort : public SortStrategy { /*...*/ };
class MergeSort : public SortStrategy { /*...*/ };
class Sorter {
SortStrategy* strategy;
public:
void setStrategy(SortStrategy* s) { strategy = s; }
void execute(std::vector<int>& data) {
strategy->sort(data);
}
};
Стандартизация решений
Повышение гибкости
Улучшение читаемости
Оптимизация архитектуры
// Современный C++ подход к Observer
class Subject {
std::vector<std::function<void(int)>> observers;
public:
void subscribe(auto&& callback) {
observers.emplace_back(std::forward<decltype(callback)>(callback));
}
void notify(int value) {
for (auto& obs : observers) obs(value);
}
};
Паттерны — это не строгие правила, а инструменты в арсенале профессионального разработчика. Их ценность в понимании, когда и какой паттерн применять, а когда — использовать более простое решение.