Что представляет собой шаблон дизайна Factory в PHP?

Это смущает меня самыми простыми словами, что он делает? Притворитесь, что вы объясняете своей матери или кому-то почти все.

Ответ 1

A factory создает объект. Итак, если вы хотите построить

 class A{
    public $classb;
    public $classc;
    public function __construct($classb, $classc)
    {
         $this->classb = $classb;
         $this->classc = $classc;
    }
  }

Вы не захотите полагаться на необходимость выполнять следующий код каждый раз при создании объекта

$obj = new ClassA(new ClassB, new Class C);

Здесь будет factory. Мы определяем factory, чтобы позаботиться об этом для нас:

class Factory{
    public function build()
    {
        $classc = $this->buildC();
        $classb = $this->buildB();
        return $this->buildA($classb, $classc);

    }

    public function buildA($classb, $classc)
    {
        return new ClassA($classb, $classc);
    }

    public function buildB()
    {
        return new ClassB;
    }

    public function buildC()
    {
        return new ClassC;
    }
}

Теперь все, что нам нужно сделать, это

$factory = new Factory;
$obj     = $factory->build();

Реальное преимущество - это когда вы хотите изменить класс. Допустим, мы хотели передать другой ClassC:

class Factory_New extends Factory{
    public function buildC(){
        return new ClassD;
    }
}

или новый ClassB:

class Factory_New2 extends Factory{
    public function buildB(){
        return new ClassE;
    }
}

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

Хорошим примером может быть этот класс пользователя:

class User{
    public $data;
    public function __construct($data)
    {
        $this->data = $data;
    }
}

В этом классе $data используется класс, который мы используем для хранения наших данных. Теперь для этого класса, скажем, мы используем сеанс для хранения наших данных. factory будет выглядеть так:

class Factory{
    public function build()
    {
        $data = $this->buildData();
        return $this->buildUser($data);
    }

    public function buildData()
    {
        return SessionObject();
    }

    public function buildUser($data)
    {
        return User($data);
    }
}

Теперь, скажем, вместо этого мы хотим хранить все наши данные в базе данных, его очень просто изменить:

class Factory_New extends Factory{
    public function buildData()
    {
        return DatabaseObject();
    }
}

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

Ответ 2

Как и в реальной жизни factory, он создает что-то и возвращает его.

Представьте себе что-то вроде этого

$joe = new Joe();
$joe->say('hello');

или factory

Joe::Factory()->say('hello');

Реализация метода factory создаст новый экземпляр и вернет его.

Ответ 3

В общем случае "factory" создает что-то: в случае Object-Orientated-Programming шаблон "factory" создает объекты.

Не имеет значения, есть ли это в PHP, С# или любом объектно-ориентированном языке.

Ответ 4

Factory Шаблон проектирования (Factory Pattern) предназначен для ослабления связи. Как и значение factory, данные для factory (производить данные) конечному пользователю. Таким образом, factory нарушает плотную связь между источником данных и процессом данных.

Ответ 6

Этот ответ относится к другому сообщению, в котором Дэниел Уайт сказал использовать factory для создания соединения MySQL с использованием шаблона factory.

Для подключения MySQL я предпочел бы использовать singleton-шаблон, поскольку вы хотите использовать такое же соединение для доступа к базе данных не создается другой.

Ответ 7

Классический подход к созданию экземпляра объекта:

$Object=new ClassName();

PHP имеет возможность динамически создавать объект из имени переменной, используя следующий синтаксис:

$Object=new $classname;

где переменная $classname содержит имя класса, которое хочет создать экземпляр.

Итак, классический факторинг объектов будет выглядеть так:

function getInstance($classname)
{
  if($classname==='Customer')
  {
    $Object=new Customer();
  }
  elseif($classname==='Product')
  {
    $Object=new Product();
  }
  return $Object;
}

и если вы вызываете функцию getInstance ('Product'), этот factory будет создавать и возвращать объект Product. В противном случае, если вы вызываете функцию getInstance ('Customer'), этот factory будет создавать и возвращать объект типа Customer (созданный из класса Customer()).

Нет необходимости в этом, можно отправить "Продукт" или "Клиент" (точные имена существующих классов) в качестве значения переменной для динамического создания экземпляра:

$classname='Product';
$Object1=new $classname; //this will instantiate new Product()

$classname='Customer';
$Object2=new $classname; //this will instantiate new Customer()

Ответ 8

Для записи, легкими словами, factory, как @Pindatjuh сказал, возвращает объект.

Итак, какая разница с конструктором? (что делает то же самое)

  • конструктор использует свой собственный экземпляр.
  • Что-то я хочу сделать что-то более продвинутое, и я не хочу раздувать объект (или добавлять зависимости).
  • Конструктор вызывается, когда создается каждый экземпляр. Иногда вы этого не хотите.

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

Использование конструктора:

class Account {
      var $user;
      var $pwd;
      var ...
      public __construct() {
         // here i read from the file
         // and many other stuff
      }
}

Использование factory:

class Account {
      var $user;
      var $pwd;
      var ...
}
class AccountFactory {
      public static Create() {
         $obj=new Account();
         // here we read the file and more stuff.
         return $obj;
      }