Языки программирования

Factory Method (фабричный метод)

В  предыдущем уроке мы узнали, что возможно поднять уровень разработки с помощью паттернов. Как именно это можно сделать, рассмотрим на примере паттерна Factory Method (фабричный метод).

Задача заключается в том, что бы принять файл, определить его тип, и, в зависимости от этого, поместить в нужную папку на сервере. Для обеспечения безопасности на сервере, к загрузки будем допускать только файлы определенных форматов.

Схема

patter

Реализация на PHP

Сначала создаем фабрику и называем ее FileFactory:

Исходя из приведенного кода программы видно, что тип передаваемого в фабрику файла не имеет значения. На его основе будет создан объект для работы с конкретным файлом.  При получении  файла не предусмотренного типа, будет выдано сообщение throw new \Exception("Неверный тип файла!"); и файл не будет обработан.

Дополняем созданную программу

Пока в нашей программе есть только фабрика, но не предусмотрен ни один тип файла, с которым можно работать. Создадим абстрактный класс с названием Upload:

Из комментариев в коде видно, что этот класс понадобится нам при создании последующих классов, посвященных разным типам файлов.

Для работы с аудио-файлами описываем следующий класс с названием UploadAudio:

Для работы с изображениями описываем следующий класс с названием UploadImage:

 Таким же образом можно добавить классы для других типов файлов, и все они также будут наследоваться от абстрактного класса Upload.

Классы реализованы, как же ними теперь воспользоваться? Надо просто принять файл в качестве входного параметра и затем передать его в FileFactory::build($_FILES['file']). Все остальное фабрика сделает за нас.

Если в будущем понадобится расширить программу, и дополнить список разрешенных форматов, то это будет очень просто сделать. Например, разрешим к загрузке текстовые типы файлов. Для этого создадим новый класс, назовем его UploadText. Он также будет наследником абстрактного класса Upload.

Думаю, теперь вы понимаете, в каких случаях и как именно можно использовать такой паттерн.