=====Фабричный Метод (Factory Method)=====
Фабричный метод (англ. Factory Method), или виртуальный конструктор (англ. Virtual Constructor) — порождающий шаблон проектирования, предоставляющий подклассам (дочерним классам) интерфейс для создания экземпляров некоторого класса. В момент создания наследники могут определить, какой класс создавать. Иными словами, данный шаблон делегирует создание объектов наследникам родительского класса. Это позволяет использовать в коде программы не специфические классы, а манипулировать абстрактными объектами на более высоком уровне.
{{ :php:шаблоны_проектирования:factory_method.png |}}
interface ISaveFactory
{
public function createSaver() : ISave;
}
class MysqlSaveFactory implements ISaveFactory
{
private $host, $user, $pass, $db;
public function __construct($host, $user, $pass, $db)
{
$this->host = $host;
$this->user = $user;
$this->pass = $pass;
$this->db = $db;
}
public function createSaver() : ISave
{
return new MysqlSave($this->host, $this->user, $this->password, $this->db);
}
}
class FileSaveFactory implements ISaveFactory
{
private $filepath;
public function __construct(string $filepath)
{
$this->filepath = $filepath;
}
public function createSaver() : ISave
{
return new FileSave($this->filepath);
}
}
interface ISave
{
public function save($message);
}
class MysqlSave implements ISave
{
private $mysqli;
public function __construct($host, $user, $pass, $db)
{
$this->mysqli = new \mysqli($host, $user, $pass, $db);
if ($this->mysqli->connect_error) {
die('Ошибка подключения (' . $this->mysqli->connect_errno . ') '
. $this->mysqli->connect_error);
}
}
public function save($message)
{
$result = $this->mysqli->query("INSERT INTO `messages`(`text`) VALUES ('" .$message . "')");
}
}
class FileSave implements ISave
{
private $filepath;
public function __construct($filepath)
{
$this->filepath = $filepath;
}
public function save($message)
{
file_put_contents($this->filepath, $message);
}
}
$factory = new MysqlSaveFactory('127.0.0.1','root','','patterns');
$factory->createSaver()->save("hello world");
PHP5 современный вариант
' . PHP_EOL;
}
}
class Cat extends Animal
{
public function voice()
{
echo 'Meow, meow i\'m the kitty
' . PHP_EOL;
}
}
$animal1 = Animal::initial('Lion');
$animal2 = Animal::initial('Cat');
$animal1->voice();
$animal2->voice();