Инженерный дизайн и анализ
Шаблоны проектирования на C++: практические примеры и стратегии решения проблем
Table of Contents
В C++ они помогают улучшить организацию кода, многоразовое использование и ремонтопригодность. В этой статье рассматриваются практические примеры популярных шаблонов дизайна и их применение для решения реальных проблем.
Синглтон Паттерн
Модель Singleton гарантирует, что класс имеет только один экземпляр и обеспечивает глобальную точку доступа к нему. Она полезна для управления общими ресурсами, такими как настройки конфигурации или системы регистрации.
Пример осуществления:
Код:
'''cpp class Logger { private: static Logger* instance; Logger() {} public: static Logger* getInstance() { if (!instance) { example = new Logger(); } return instance; } void log(const std::string& message) { // Log message } }; Logger* Logger::instance = nullptr; '''
Модель метода фабрики
Модель Factory Method определяет интерфейс для создания объектов, но позволяет подклассам изменять тип объектов, которые будут созданы. Она способствует свободной связи и масштабируемости.
Примерный сценарий: создание различных типов документов.
Код:
** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
План наблюдателя
Модель Наблюдателя устанавливает зависимость от одного объекта ко многим, так что при изменении состояния одного объекта все его иждивенцы уведомляются автоматически. Она полезна для реализации систем обработки событий.
Пример: простая система событий, в которой несколько наблюдателей реагируют на изменения.
Код:
''cpp #include #include class Observer { public: virtual void update() = 0; virtual ~Observer() {} }; class Subject { private: std::vector Observers; public: void attach(Observer* Observer) { Observer.push back(observer); } void notify() { for (auto* Observer : Observer : Observer : Observer { Observer->update(); } } }; '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''