Что такое шаблон фабричного дизайна в PHP? - PullRequest
83 голосов
/ 18 января 2010

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

Ответы [ 9 ]

169 голосов
/ 18 января 2010

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

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

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

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

18 голосов
/ 18 января 2010

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

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

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

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

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

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

7 голосов
/ 25 апреля 2018

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

Давайте разберем это на другой раздел.

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

Ему / ей просто нужно беспокоиться об использовании ваших методов класса.

например. У вас есть две базы данных для вашего проекта

class MySQLConn {

        public function __construct() {
                echo "MySQL Database Connection" . PHP_EOL;
        }

        public function select() {
                echo "Your mysql select query execute here" . PHP_EOL;
        }

}

class OracleConn {

        public function __construct() {
                echo "Oracle Database Connection" . PHP_EOL;
        }

        public function select() {
                echo "Your oracle select query execute here" . PHP_EOL;
        }

}

Ваш класс Factory позаботится о создании объекта для подключения к базе данных.

class DBFactory {

        public static function getConn($dbtype) {

                switch($dbtype) {
                        case "MySQL":
                                $dbobj = new MySQLConn();
                                break;
                        case "Oracle":
                                $dbobj = new OracleConn();
                                break;
                        default:
                                $dbobj = new MySQLConn();
                                break;
                }

                return $dbobj;
        }

}

Пользователю просто нужно передать имя типа базы данных

$dbconn1 = DBFactory::getConn("MySQL");
$dbconn1->select();

Выход:

MySQL Database Connection
Your mysql select query execute here

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

$dbconn2 = DBFactory::getConn("Oracle");
$dbconn2->select();

Выход:

Oracle Database Connection
Your oracle select query execute here

Надеюсь, это поможет.

1 голос
/ 17 июня 2013

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

1 голос
/ 18 января 2010

Обычно «фабрика» производит что-то: в случае объектно-ориентированного программирования «фабричная конструкция» производит объекты.

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

0 голосов
/ 27 марта 2016

Для простоты, фабрика, подобная @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;
      }
0 голосов
/ 14 сентября 2014

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

$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 ()).

В этом больше нет необходимости, можно отправлять «Product» или «Customer» (точные имена существующих классов) в качестве значения переменной для динамической реализации:

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

$classname='Customer';
$Object2=new $classname; //this will instantiate new Customer()
0 голосов
/ 09 апреля 2014

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

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

0 голосов
/ 18 января 2010

Фабрика просто генерирует объект или объекты.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...