Шаблоны проектирования. Factory Method.

Шаблон Factory Method относится к типу шаблонов, генерирующих объекты. Он хорошо решает задачу, когда в коде используются абстрактные типы.

Пусть перед нами стоит задача создать обмен данными в различных форматах между двумя пунктами. При этом известно сначала, что формат обмена данными - XML, но система может в будущем расширяться и добавлять новые форматы коммуникаций. Таким образом нам нужно создать гибкую структуру.

Первое, что приходит в голову, это создать абстрактный класс Encoder и класс XMLEncoder, реализующий Encoder, который получает некие данные и формирую XML-документ, и класс HandManager, который будет работать с сформированными документами.

Будет что-то вроде этого:

 

Как видно из примера в классе HandManager есть существенный недостаток. Если нам понадобиться внести новый тип документа в наши коммуникации, то внутри метода getEncoder будет разрастаться условный оператор вроде такого:

 

Как видно, это не очень удобно. К тому же нужно очень четко определять документацией соответствие значений модификатора $mode. Легко представить сколько места займут условные конструкции, если в классе HandManager добавятся еще несколько методов, использующих проверку модификатора.

Тут то и приходит на помощь Factory Method. Суть в том, что мы переопределим класс HandManager в абстрактный класс, а далее реализуем его под каждый тип документа. Так, например, для XMLEncoder реализуем класс-создатель XMLHandManager, для PDFEncoderPDFHandManager.

 

Как видно теперь, мы избавились от условных конструкций за счет полиморфизма.

Многие программисты не очень любят Factory Method, считая его особым методом дублирования кода, заместо условных операторов. В этом есть доля правды. Этот шаблон надо использовать очень осторожно, так как он ведет к созданию множества подклассов. Поэтому если использование обусловлено только генерацией подклассов, то лучше поискать другой выход…

1 комментарий Шаблоны проектирования. Factory Method.

  1. Пингбэк: Шаблоны проектирования. Abstract Factory. |  I-paper.ru

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">