Шаблоны проектирования GoF - это рецепты обходных путей для ОО-языков, которые являются потомками Simula 67, таких как Java и C ++.
Большинство "недугов", с которыми сталкиваются шаблоны проектирования, вызваны:
- статически типизированные классы, которые определяют объекты, но сами не являются объектами;
- ограничение на одну отправку (для выбора метода используется только крайний левый аргумент, остальные аргументы считаются только статическими типами: если они имеют динамические типы, то метод должен решать это с помощью специальных подходов) ;
- различие между вызовами обычных функций и вызовами объектно-ориентированных функций, означающими, что объектно-ориентированные функции не могут быть переданы в качестве функциональных аргументов, когда ожидаются обычные функции, и наоборот; и
- различие между "базовыми типами" и "типами классов".
Нет ни одного из этих шаблонов проектирования, который не исчезнет в Common Lisp Object System, хотя решение структурировано по существу так же, как в соответствующем шаблоне проектирования. (Более того, эта объектная система предшествует книге GoF более чем на десятилетие. Common Lisp стал стандартом ANSI в том же году, когда эта книга была впервые опубликована.)
Что касается функционального программирования, то, применимы ли к нему шаблоны, зависит от того, имеет ли данный функциональный язык программирования какую-либо объектную систему и моделируется ли она по объектным системам, которые получают выгоду от шаблонов. Этот тип объектной ориентации плохо сочетается с функциональным программированием, потому что мутация состояния находится спереди и в центре.
Конструкция и доступ без мутаций совместимы с функциональным программированием, и поэтому могут применяться шаблоны, которые имеют отношение к абстрагированию доступа или конструкции: шаблоны, такие как Factory, Facade, Proxy, Decorator, Visitor.
С другой стороны, поведенческие паттерны, такие как State и Strategy, вероятно, не непосредственно применяются в функциональных ООП, потому что в основе лежит мутация состояния. Это не значит, что они не применяются; возможно, они каким-то образом применяются в сочетании с любыми доступными приемами для имитации изменяемого состояния.