Интересные разделы:

Шаблон Factory

Обнавлено: 01.02.2020

В этой маленькой статье подробно описан шаблон Factory Method

В объектно-ориентированном дизайне упор делается на абстрактный класс, а не на его реализацию, то есть на обобщение, а не на детали. Модель шаблона фабрика решает проблему получения экземпляров объекта, когда в исходном коде используются абстрактные типы. И каково решение? Это предполагает возложение обязанности получать копии объектов на специальные классы.

Решение

В шаблоне Factory методы производителя отделены от продуктов, которые они должны создать. Производитель – это фабричный класс, который определяет метод формирования объекта из одного продукта. Если стандартная реализация этого метода не предусмотрена, извлечение экземпляра объекта поручается дочерним классам производителя. Как правило, экземпляр дочернего класса продукта получается в каждом подклассе производителя. Переопределите класс MainManager как абстрактный. Таким образом, мы храним гибкий суперкласс и организуем весь код, назначенный конкретному протоколу, в отдельные подклассы

<?php

abstract class MainEncoder
{
    abstract public function encode(): string;
}

class M2bEncoder extends MainEncoder
{
    public function encode(): string
    {
        return "Данные закодированны в M2b \n";
    }
}

class CtbEncoder extends MainEncoder
{
    public function encode(): string
    {
        return "Данные закодированны в Ctb \n";
    }
}

abstract class MainManager {
    abstract public function getHeaderText(): string;
    abstract public function getApptEncoder(): MainEncoder;
    abstract public function getFooterText(): string;
}

class ManagerOne extends MainManager
{
    public function getHeaderText(): string
    {
        return "M2b Шапка \n";
    }

    public function getApptEncoder(): MainEncoder
    {
        return new M2bEncoder();
    }

    public function getFooterText(): string
    {
        return "M2b Футер \n";
    }
}

class ManagerTwo extends MainManager
{
    public function getHeaderText(): string
    {
        return "Ctb Шапка \n";
    }

    public function getApptEncoder(): MainEncoder
    {
        return new CtbEncoder();
    }

    public function getFooterText(): string
    {
        return "Ctb Футер \n";
    }
}

$manager = new ManagerOne();
print $manager->getHeaderText();
print $manager->getApptEncoder()->encode();
print $manager->getFooterText();

Заключение

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