Я не уверен, в какой степени фабричный метод шаблон проектирования полезен в функциональном программировании.
Цель шаблона - скрыть создание объектов, чтобы вы могли работать только с абстрактным представлением объекта.
- Когда вы используете F # функциональным способом , большую часть времени вы будете использовать конкретные представления. Например, это дает вам возможность сопоставить шаблон по типу скейтборда.
- Конечно, F # позволяет смешивать функциональный стиль с объектно-ориентированным стилем. В некоторых целях стиль ОО хорошо работает в F #. В этом случае ваш подход выглядит вполне разумным.
Ваш фабричный метод может принимать конкретный тип (например, дискриминированное объединение) в качестве аргумента вместо строки. Тогда задача фабрики - построить абстрактное представление из конкретного представления:
// Abstract representation of the data
type ISkateBoard =
abstract Model : unit -> string
// Concrete representation of the data
type SkateBoard =
| Roskopp
| Peters
Теперь фабрика будет просто функцией типа SkateBoard -> ISkateBoard
. Например (используя выражения объекта F #):
// Transform concrete representation to abstract representation
let factory concrete =
match concrete with
| Roskopp -> { new ISkateBoard with
member x.Model() = "Rob Roskopp..." }
| Peters -> { new ISkateBoard with
member x.Model() = "Duane Peters..." }
Я думаю, что преимущество этого подхода состоит в том, что вы можете выполнить некоторую работу над конкретным представлением типа (например, некоторые вычисления, где вам нужно сопоставление с образцом), но затем вы можете использовать factory
, чтобы превратить конкретный тип в абстрактный тип.
Это вполне соответствует обычному подходу в функциональном программировании - вы часто используете различные представления одних данных и выполняете преобразования между ними (в зависимости от того, какое представление лучше для конкретной задачи).