Проблема:
Генерация связанных наборов классов которые реализуют единый интерфейс. На примере реализуем парсер разных форматов.
Решение:
[file: Parser.php] — интерфейс для парсера
1 2 3 4 |
interface Parser { public function parse(string $input): array; } |
[file: CsvParser.php] — класс парсер csv файлов
1 2 3 4 5 6 7 |
class CsvParser implements Parser { public function parse(string $input): array { // парсим csv файл } } |
[file: JsonParser.php] — класс парсер json
1 2 3 4 5 6 7 |
class JsonParser implements Parser { public function parse(string $input): array { return json_decode($input, true); } } |
[file: ParserFactory.php] — фабрика для генерации классов реализации парсера
1 2 3 4 5 6 7 8 9 10 11 12 |
class ParserFactory { public function createCsvParser(bool $csv): CsvParser { return new CsvParser($csv); } public function createJsonParser($json): JsonParser { return new JsonParser($json); } } |
Применение
1 2 3 |
$factory = new ParserFactory(); $parser = $factory->createCsvParser(); $result = $parser->parse($csv_file); |
Плюсы:
Мы отделили систему от деталей реализации, можем создавать новые форматы для парсера, не меняя текущий код(только добавлять в фабрику).
Так же мы сгруппировали функционально связанные элементы.
Минусы:
Мы привязываемся к фабрике которая которая имеет сильную функциональную связанность, тем самым мы немного теряем в расширяемости, если нам понадобится добавить дополнительный функционал к парсерам а не новый парсер.
Комментарии закрыты!