Инструменты пользователя

Инструменты сайта


php:shablony_proektirovanija:generative_patterns:fabric_method

Фабричный Метод (Factory Method)

Фабричный метод (англ. Factory Method), или виртуальный конструктор (англ. Virtual Constructor) — порождающий шаблон проектирования, предоставляющий подклассам (дочерним классам) интерфейс для создания экземпляров некоторого класса. В момент создания наследники могут определить, какой класс создавать. Иными словами, данный шаблон делегирует создание объектов наследникам родительского класса. Это позволяет использовать в коде программы не специфические классы, а манипулировать абстрактными объектами на более высоком уровне.

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
/**
 * Class Animal, со времен первой редакции книги прошло более 20 лет и этот паттерн немного эволюционировал,
 * и теперь всегда используют его сокращенную форму
 */
abstract class Animal
{
    // фабричный метод, который на основе типа возвращает объект
    public static function initial($animal)
    {
        return new $animal();
    }
    abstract public function voice();
}
 
class Lion extends Animal
{
    public function voice()
    {
        echo 'Rrrrrrrr i\'m the lion <br />' . PHP_EOL;
    }
}
 
class Cat extends Animal
{
    public function voice()
    {
        echo 'Meow, meow i\'m the kitty <br />' . PHP_EOL;
    }
}
 
$animal1 = Animal::initial('Lion');
$animal2 = Animal::initial('Cat');
 
$animal1->voice();
$animal2->voice();
php/shablony_proektirovanija/generative_patterns/fabric_method.txt · Последние изменения: 2023/08/07 23:05 — werwolf