Фабричный шаблон PHP

PHP продукт

Шаблон фабричного метода основан на наследовании, поскольку создание объекта делегируется подклассам, которые реализуют фабричный метод для создания объекта.

UML类图

На приведенной выше диаграмме классов URLCreatorнеобходимостьProductобъектProduct1Классы не создают экземпляры классов напрямую. Вместо этого этоCreatorзначит одинfactoryMethod()Создайте объект продукта, который делаетCreatorНезависимо от того, какой конкретный класс создается.CreatorПодклассы создаваемого класса могут быть переопределены. В этом примереCreator1ПодклассfactoryMethod()Абстракция путем создания экземпляра классаProduct1.

Выше приведено краткое описание рабочего процесса фабрики, ключевые моменты см. ниже.

1. Простой заводской шаблон

  • определение схемы:Простой фабричный шаблон (Simple Factory Pattern): также известный как шаблон Static Factory Method (Статический фабричный метод), причина, по которой мы можем так говорить, заключается в том, что простой фабричный шаблон создает объекты с помощью статического метода. Он принадлежит шаблону создания класса. В простом фабричном шаблоне вы можете возвращать экземпляры разных классов в соответствии с разными параметрами. Простой фабричный шаблон специально определяет класс, ответственный за создание экземпляров других классов, и созданные экземпляры обычно имеют общий родительский класс.
  • структура схемы
  1. Фабрика: Фабричная роль

    Роль factory отвечает за реализацию внутренней логики создания всех экземпляров.

  2. Продукт: абстрактный персонаж продукта

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

  3. ConcreteProduct: роль бетонного продукта

    Конкретная роль продукта является целью создания, и все созданные объекты действуют как экземпляры конкретного класса для этой роли.

взять каштан

Мы хотим создать фабрику по производству кошек и собак! Что мы обычно делаем

interface animals // 抽象产品角色
{
    public function animal();
}
class Cat implements animals // 具体产品角色
{
    public function animal()
    {
        return "猫猫";
    }
}
class Dog implements animals // 具体产品角色
{
    public function animal()
    {
        return "狗狗";
    }
}
class Factory // 工厂角色
{
    public static function createAnimal($param)
    {
        $result = null;
        switch($param)
        {
            case 'cat':
                $result = new Cat();
                break;
            case 'dog':
                $result = new Dog();
                break;
        }
        return $result;
    }
}
echo  Factory::createAnimal("cat")->animal(); // 猫猫
echo  Factory::createAnimal("dog")->animal(); // 狗狗

Приведенный выше примерПростая фабрика (статическая фабрика)

Простая фабричная применимая среда

  • Фабричный класс отвечает за создание меньшего количества объектов: поскольку создается меньше объектов, бизнес-логика в фабричном методе не будет слишком сложной.
  • Клиенту известны только параметры, переданные в фабричный класс, и его не волнует, как создать объект: клиенту не нужно заботиться ни о деталях создания, ни даже об имени класса, ему нужно знать только параметры, соответствующие тип.

2. Шаблон фабричного метода

Шаблон фабричного метода(Шаблон фабричного метода), также известный какзаводской узор, также известный как шаблон Виртуальный конструктор (Virtual Constructor) или шаблон Полиморфная фабрика (Polymorphic Factory), который относится к шаблону создания класса. В шаблоне метода фабрики родительский класс фабрики отвечает за определение общедоступного интерфейса для создания объектов продукта, а подкласс фабрики отвечает за создание конкретных объектов продукта. Цель этого состоит в том, чтобы отложить создание экземпляра класса продукта на фабрике. подкласс, то есть через подкласс фабрики, чтобы определить, какой конкретный класс продукта должен быть создан.

Возьмите каштан:

abstract class animals // 抽象产品类
{
    abstract public function animal();
}
class Cat extends animals // 具体产品类
{
    public function animal()
    {
        return "猫猫";
    }
}
class Dog extends animals // 具体产品类
{
    public function animal()
    {
        return "狗狗";
    }
}
interface Factory   // 抽象工厂类, 将对象的创建抽象成一个接口
{
    public function create();
}
class CatFactory implements Factory  // 继承工厂类, 用于实例化产品
{
    public function create()
    {
        return new Cat();
    }
}
class DogFactory implements Factory  // 继承工厂类, 用于实例化产品
{
    public function create()
    {
        return new Dog();
    }
}

class Client    // 具体操作类
{
    public function test()
    {
        $catResult = new CatFactory();
        echo $catResult->create()->animal();

        $DogResult = new DogFactory();
        echo $DogResult->create()->animal();
    }
}

$lala = new Client();
$lala->test(); //  猫猫狗狗

Определите интерфейс для создания объектов и позвольте подклассам решать, какой класс создавать. Он может решить проблему принципа закрыто-открыто в простой фабричной схеме.

[Шаблон фабричного метода и простой фабричный шаблон]

  • Паттерн фабричный метод структурно не сильно отличается от простого фабричного шаблона. Ядром класса фабричных методов является абстрактный фабричный класс, в то время как простой шаблон фабрики помещает ядро ​​в конкретный класс.
  • Шаблон фабричного метода имеет псевдоним, называемый полиморфным фабричным шаблоном, потому что конкретные фабричные классы имеют общий интерфейс или общий абстрактный родительский класс.
  • Когда для расширения системы необходимо добавить новый объект продукта, необходимо добавить только конкретный объект и конкретный объект фабрики.Исходный объект фабрики не нужно изменять, а также не нужно изменять клиент, который находится в очереди с "открыто-закрыто".в принципе. Простой фабричный шаблон должен модифицировать фабричный метод после добавления нового объекта продукта, а расширяемость не очень хороша.
  • После того, как шаблон фабричного метода выродится, он может превратиться в простой фабричный шаблон.

3. Абстрактная фабрика

Абстрактный заводской узор(Шаблон абстрактной фабрики): предоставляет интерфейс для создания ряда связанных или взаимозависимых объектов без указания их конкретных классов. Шаблон абстрактной фабрики, также известный как шаблон Kit, представляет собой шаблон создания объектов.

interface AnimalsFactory // 抽象工厂
{
    public function createCat(); // 生产一尾猫
    public function createDog(); // 生产一头狗 -_-
}

abstract class Cat  // 猫抽象
{
    abstract function getCat();
}
class ForeignCat extends Cat // 猫具体
{
    public function getCat()
    {
        return "外国布偶猫".PHP_EOL;
    }
}
class ChineseCat extends Cat
{
    public function getCat()
    {
        return "华夏猫".PHP_EOL;
    }
}

abstract class Dog
{
    abstract function getDog();
}
class ChineseDog extends Dog
{
    public function getDog()
    {
        return "中华国犬".PHP_EOL;
    }
}
class ForeignDog extends Dog
{
    public function getDog()
    {
        return "外国哈士奇".PHP_EOL;
    }
}

class CreateChineseAnimalFactory implements AnimalsFactory 
{
    public function createCat()
    {
        return new ChineseCat();
    }
    public function createDog()
    {
        return new ChineseDog();
    }
}
class CreateForeignAnimalFactory implements AnimalsFactory
{
    public function createCat()
    {
        return new ForeignCat();
    }
    public function createDog()
    {
        return new ForeignDog();
    }
}

$result = new CreateForeignAnimalFactory();
$ForeignCat = $result->createCat();
echo $ForeignCat->getCat(); // 布偶猫

$ForeignDog = $result->createDog();
echo $ForeignDog->getDog(); // 哈士奇

Суммировать

разница

  1. Простой шаблон фабрики (шаблон фабрики статического метода): используется для производства любого продукта в той же иерархии. (Нельзя добавлять новые продукты)

  2. Фабричный шаблон: используется для производства фиксированных продуктов в той же иерархической структуре. (поддерживает добавление любого продукта)

  3. Абстрактная фабрика: используется для производства всех продуктов разных категорий. (Невозможно добавлять новые продукты, поддерживается добавление типов продуктов)

Эпилог

использоватьзаводской узорХорошее время не всегда очевидно. Не форсируйте это, много абстракции требуется только при построении сложных систем. Вам просто нужно знать, что такое абстрактная фабрика, и рано или поздно вы найдете реальный вариант использования. удачи!

Написано 25 мая 2018 г.