Это смущает меня самыми простыми словами, что он делает? Притворитесь, что вы объясняете своей матери или кому-то почти все.
Что представляет собой шаблон дизайна 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 нарушает плотную связь между источником данных и процессом данных.
Ответ 5
A factory просто генерирует объект или объекты.
У вас может быть factory, который создает соединение MySQL.
Ответ 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;
}