Паттерны GoF(Банда 4)
Порождающие паттерны:
-
Фабричный метод (Factory Method)
Фабричный метод (Factory Method) — это паттерн, который определяет интерфейс для создания объектов некоторого класса, но непосредственное решение о том, объект какого класса создавать происходит в подклассах. То есть паттерн предполагает, что базовый класс делегирует создание объектов классам-наследникам.
Пример применения: создайте NPC или виджеты GUI на основе строки, прочитанной из файла
Абстрактная фабрика (Abstract Factory)
Паттерн «Абстрактная фабрика» (Abstract Factory) предоставляет интерфейс для создания семейств взаимосвязанных объектов с определенными интерфейсами без указания конкретных типов данных объектов.
Одиночка (Singleton)
Одиночка (Singleton, Синглтон) — порождающий паттерн, который гарантирует, что для определенного класса будет создан только один объект, а также предоставит к этому объекту точку доступа.
Прототип (Prototype)
Паттерн Прототип (Prototype) позволяет создавать объекты на основе уже ранее созданных объектов-прототипов. То есть по сути данный паттерн предлагает технику клонирования объектов.
Пример использования: сохраните один универсальный символ ‘Эльф’ с начальными свойствами и создайте экземпляры Эльфа, клонируя его.
Строитель (Builder)
Строитель (Builder) — шаблон проектирования, который инкапсулирует создание объекта и позволяет разделить его на различные этапы.
Пример применения: настройка компонента на основе компонентов по одному компоненту за раз на основе данных
Паттерны поведения:
Стратегия (Strategy)
Паттерн Стратегия (Strategy) представляет шаблон проектирования, который определяет набор алгоритмов, инкапсулирует каждый из них и обеспечивает их взаимозаменяемость. В зависимости от ситуации мы можем легко заменить один используемый алгоритм другим. При этом замена алгоритма происходит независимо от объекта, который использует данный алгоритм.
Пример применения: переключаться между различными эвристиками для поиска A *, в зависимости от того, в какой местности вы находитесь, или, возможно, даже использовать одну и ту же среду A * для выполнения поиска пути и более общего планирования
Наблюдатель (Observer)
Паттерн «Наблюдатель» (Observer) представляет поведенческий шаблон проектирования, который использует отношение «один ко многим». В этом отношении есть один наблюдаемый объект и множество наблюдателей. И при изменении наблюдаемого объекта автоматически происходит оповещение всех наблюдателей.
Наблюдатель: иметь визуализируемое представление персонажа, слушающего события из логического представления, чтобы при необходимости изменять визуальное представление, при этом игровой логике не нужно ничего знать о рендеринге кода
Команда (Command)
Паттерн «Команда» (Command) позволяет инкапсулировать запрос на выполнение определенного действия в виде отдельного объекта. Этот объект запроса на действие и называется командой. При этом объекты, инициирующие запросы на выполнение действия, отделяются от объектов, которые выполняют это действие.
Команды могут использовать параметры, которые передают ассоциированную с командой информацию. Кроме того, команды могут ставиться в очередь и также могут быть отменены.
Пример применения: инкапсулировать функциональность игры в виде команд, которые можно вводить в консоль, сохранять и воспроизводить, или даже создавать сценарии для помощи в тестировании игры.
Шаблонный метод (Template Method)
Шаблонный метод (Template Method) определяет общий алгоритм поведения подклассов, позволяя им переопределить отдельные шаги этого алгоритма без изменения его структуры.
Шаблонный метод: настройте общую «боевую» подпрограмму с различными функциями ловушек для обработки каждого шага, например. уменьшать боеприпасы, рассчитывать вероятность попадания, разрешать попадания или пропуски, рассчитывать урон, и каждый тип навыка атаки будет реализовывать методы по-своему
Итератор (Iterator)
Паттерн Итератор (Iterator) предоставляет абстрактный интерфейс для последовательного доступа ко всем элементам составного объекта без раскрытия его внутренней структуры.
Состояние (State)
Состояние (State) — шаблон проектирования, который позволяет объекту изменять свое поведение в зависимости от внутреннего состояния.
State: хранить NPC AI как одно из нескольких состояний, например. Атакующий, блуждающий, убегающий. У каждого может быть свой собственный метод update () и любые другие необходимые ему данные (например, хранение символа, из которого он атакует или бежит, области, в которой он блуждает, и т. Д.)
Цепочка Обязанностей (Chain of responsibility)
Цепочка Обязанностей (Chain of responsibility) — поведенческий шаблон проектирования, который позволяет избежать жесткой привязки отправителя запроса к получателю. Все возможные обработчики запроса образуют цепочку, а сам запрос перемещается по этой цепочке. Каждый объект в этой цепочке при получении запроса выбирает, либо закончить обработку запроса, либо передать запрос на обработку следующему по цепочке объекту.
Цепочка ответственности: обрабатывать ввод как цепочку обработчиков, например. глобальные клавиши (например, для снимков экрана), затем GUI (например, в случае, если текстовое поле находится в фокусе или меню вверх), затем игра (например, для перемещения персонажа)
Интерпретатор (Interpreter)
Паттерн Интерпретатор (Interpreter) определяет представление грамматики для заданного языка и интерпретатор предложений этого языка. Как правило, данный шаблон проектирования применяется для часто повторяющихся операций.
Посредник (Mediator)
Паттерн Посредник (Mediator) представляет такой шаблон проектирования, который обеспечивает взаимодействие множества объектов без необходимости ссылаться друг на друга. Тем самым достигается слабосвязанность взаимодействующих объектов.
Пример применения: реализуйте игровые сущности в виде небольшого класса посредника, который работает с различными компонентами (например, чтение из компонента здоровья для передачи данных в компонент AI)
Хранитель (Memento)
Паттерн Хранитель (Memento) позволяет выносить внутреннее состояние объекта за его пределы для последующего возможного восстановления объекта без нарушения принципа инкапсуляции.
Посетитель (Visitor)
Паттерн Посетитель (Visitor) позволяет определить операцию для объектов других классов без изменения этих классов.
При использовании паттерна Посетитель определяются две иерархии классов: одна для элементов, для которых надо определить новую операцию, и вторая иерархия для посетителей, описывающих данную операцию.
Структурные паттерны:
Декоратор (Decorator)
Декоратор (Decorator) представляет структурный шаблон проектирования, который позволяет динамически подключать к объекту дополнительную функциональность.
Для определения нового функционала в классах нередко используется наследование. Декораторы же предоставляет наследованию более гибкую альтернативу, поскольку позволяют динамически в процессе выполнения определять новые возможности у объектов.
-
Адаптер (Adapter)
Паттерн Адаптер (Adapter) предназначен для преобразования интерфейса одного класса в интерфейс другого. Благодаря реализации данного паттерна мы можем использовать вместе классы с несовместимыми интерфейсами.
Пример применения: включите дополнительную стороннюю библиотеку, обернув ее в слой, который выглядит как существующий код. Очень полезно с DLL.
-
Фасад (Facade)
Фасад (Facade) представляет шаблон проектирования, который позволяет скрыть сложность системы с помощью предоставления упрощенного интерфейса для взаимодействия с ней.
Пример применения: упростите сложные сторонние библиотеки, предоставив более простой интерфейс, чтобы сделать вашу жизнь проще в будущем.
-
Компоновщик (Composite)
Паттерн Компоновщик (Composite) объединяет группы объектов в древовидную структуру по принципу «часть-целое и позволяет клиенту одинаково работать как с отдельными объектами, так и с группой объектов.
Образно реализацию паттерна можно представить в виде меню, которое имеет различные пункты. Эти пункты могут содержать подменю, в которых, в свою очередь, также имеются пункты. То есть пункт меню служит с одной стороны частью меню, а с другой стороны еще одним меню. В итоге мы однообразно можем работать как с пунктом меню, так и со всем меню в целом.
-
Заместитель (Прокси)
Паттерн Заместитель (Proxy) предоставляет объект-заместитель, который управляет доступом к другому объекту. То есть создается объект-суррогат, который может выступать в роли другого объекта и замещать его.
Пример применения: создайте на клиенте небольшие классы, представляющие более крупные и сложные классы на сервере, и пересылайте запросы по сети.
-
Мост (Bridge)
Мост (Bridge) — структурный шаблон проектирования, который позволяет отделить абстракцию от реализации таким образом, чтобы и абстракцию, и реализацию можно было изменять независимо друг от друга.
-
Приспособленец (Flyweight)
Паттерн Приспособленец (Flyweight) — структурный шаблон проектирования, который позволяет использовать разделяемые объекты сразу в нескольких контекстах. Данный паттерн используется преимущественно для оптимизации работы с памятью.
Пример применения: хранить общие аспекты NPC (например, модели, текстуры, анимации) отдельно от отдельных аспектов (например, положение, здоровье) в основном прозрачным способом
Паттерны игрового проектирования
Последовательные шаблоны:
-
Двойная буферизация (Double Buffering)
Дать возможность ряду последовательных операций выполняться мгновенно или одновременно.
-
Игровой цикл(Game Loop)
Устранить зависимость игрового времени от пользовательского ввода и скорости процессора
-
Метод обновления (Update Method)
Симуляция коллекции независимых объектов с помощью указания каждому объекту обработки одного кадра поведения за раз.
Поведенческие шаблоны:
Байткод (Bytecode)
Обеспечить поведению гибкость данных, декодируемых в виде инструкций для виртуальной машины.
Подкласс песочница (Subclass Sandbox)
Определение поведения в подклассе с помощью набора операций, предоставляемых базовым классом.
Объект тип (Type Object)
Сделать более гибким создание новых «классов» с помощью создания класса, каждый экземпляр которого может представлять собой другой тип объекта.
Шаблоны уменьшения связности:
Компонент(Component)
Позволяет одной сущности охватывать несколько областей, не связывая их между собой.
Очередь событий (Event Queue)
Позволяет одной сущности охватывать несколько областей, не связывая их между собой.
ПодробнееПоиск службы (Service Locator)
Обеспечить глобальную точку доступа к службе без привязки пользователя к конкретному классу, который ее реализует.
Основная сложность при работе с поиском службы заключается в том, что он берет зависимость — связь между двумя кусками кода — и откладывает их связывание до времени выполнения
Шаблоны оптимизации:
Локализация данных (Data Locality)
Ускорение доступа к памяти с помощью более удобного для кэширования процессором размещения данных.
Грязный флаг (Dirty Flag)
Избегать ненужной работы, откладывая ее до тех пор, пока не потребуется результат.
Набор первичных данных изменяется со временем. Набор вторичных данных вычисляется на основе первичных с помощью ресурсоемкого процесса. «Грязный» флаг отслеживает рассинхронизацию вторичных данных с первичными. Он устанавливается, когда первичные данные изменяются. Если флаг установлен, когда нам понадобились вторичные данные, они вычисляются и флаг снимается. В противном случае используются уже вычисленные вторичные данные.
Пул объектов (Object Pool)
Улучшение производительности и эффективности использования памяти за счет повторного использования объектов из фиксированного пула, вместо их индивидуального выделения и освобождения.
Разделение пространства (Spatial Partition)
Эффективный поиск находящихся рядом объектов с помощью сохранения их в структуре данных с организацией на основе их местоположения.
example in guitHub
Must know: singleton, observer, command, component, flyweght, state, mediator, event dispatcher
GRASP Информационный эксперт (Information Expert) Низкая связанность (Low Coupling) Высокое зацепление (High Cohesion) Устойчивый к изменениям (Protected Variantions) Контроллер (Controller) Полиморфизм (Polymorphism) Чистая выдумка (Pure Fabrication) Перенаправление (Indirection) Создатель (Creator)