Это смущает меня, самыми простыми словами, что он делает? Притворяйтесь, что вы просто объясняете своей матери или кому-то.
Завод создает объект. Итак, если вы хотите построить
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.
Этот ответ относится к другому сообщению, в котором Даниэль Уайт сказал использовать фабрику для создания соединения 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, говорит, возвращает объект.
Итак, какая разница с конструктором? (что делает то же самое)
Конструктор вызывается, когда создается каждый экземпляр. Иногда ты этого не хочешь.
Например, предположим, что каждый раз, когда я создаю объект класса 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; }