Что такое шаблон фабричного проектирования в PHP?

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

Solutions Collecting From Web of "Что такое шаблон фабричного проектирования в PHP?"

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

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); 

Именно здесь зайдет фабрика. Мы определяем фабрику, которая позаботится об этом для нас:

 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 – это класс, который мы используем для хранения наших данных. Теперь для этого класса, скажем, мы используем сеанс для хранения наших данных. Завод будет выглядеть так:

 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(); } } 

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

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

Представьте себе что-то подобное

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

или заводского метода

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

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

В общем, «фабрика» что-то производит: в случае Object-Orientated-Programming «фабричный шаблон дизайна» создает объекты.

Не имеет значения, находится ли он в PHP, C # или любом другом объектно-ориентированном языке.

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

Завод только генерирует объект или объекты.

У вас может быть фабрика, которая создает соединение MySQL.

http://en.wikipedia.org/wiki/Factory_method_pattern

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

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

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

 $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'), эта фабрика будет создавать и возвращать объект Product. В противном случае, если вы вызываете функцию getInstance ('Customer'), эта фабрика создаст и вернет объект типа Customer (созданный из класса Customer ()).

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

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

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

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

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

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

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

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

Использование фабрики:

 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; }