=====Фабричный Метод (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();