Абстрактная фабрика

Абстрактная фабрика (англ. Abstract factory) — порождающий шаблон проектирования, предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, не специфицируя их конкретных классов. Шаблон реализуется созданием абстрактного класса Factory, который представляет собой интерфейс для создания компонентов системы (например, для оконного интерфейса он может создавать окна и кнопки). Затем пишутся классы, реализующие этот интерфейс.

<?php
interface DatabaseFactory
{
    public function connect() : DatabaseConnect;
 
    public function query() : DatabaseQuery;
}
 
class MysqlDatabaseFactory implements DatabaseFactory
{
 
    private
        $host,
        $user,
        $pass,
        $db;
 
    public function __construct(string $host, string $user, string $pass, string $db) {
        $this->host = $host;
        $this->user = $user;
        $this->pass = $pass;
        $this->db = $db;
    }
 
    public function connect() : DatabaseConnect
    {
        return new MysqlDatabaseConnect($this->host,$this->user,$this->pass,$this->db);
    }
 
    public function query() : DatabaseQuery
    {
        return new MysqlDatabaseQuery($this->connect());
    }
}
 
 
class SqliteDatabaseFactory implements DatabaseFactory
{
    private $filename;
 
    public function __construct(string $filename) {
        $this->filename = $filename;
 
    }
 
    public function connect() : DatabaseConnect
    {
        return new SqliteDatabaseConnect($this->filename);
    }
 
    public function query() : DatabaseQuery
    {
        return new SqliteDatabaseQuery($this->connect());
    }
}
 
interface DatabaseConnect
{
    public function connection();
}
 
interface DatabaseQuery
{
    public function execute(string $query);
}
 
class MysqlDatabaseConnect implements DatabaseConnect
{
    private $mysqli;
 
    public function __construct($host, $user, $password,  $db) {
        $this->mysqli = new \mysqli($host, $user, $password,  $db);
 
        if ($this->mysqli->connect_error) {
            die('Ошибка подключения (' . $this->mysqli->connect_errno . ') '
                . $this->mysqli->connect_error);
        }
    }
 
    public function connection()
    {
        return $this->mysqli;
    }
}
 
class SqliteDatabaseConnect implements DatabaseConnect
{
    private $sqlite;
 
    public function __construct($filename) {
        $this->sqlite = new \SQLite3($filename);
    }
 
    public function connection() {
        return $this->sqlite;
    }
}
 
class MysqlDatabaseQuery implements DatabaseQuery
{
 
    private $connector;
 
    public function __construct(DatabaseConnect $connector) {
        $this->connector = $connector;
    }
 
    public function execute(string $query)
    {
        $this->connector->connection()->query($query);
    }
}
 
 
class SqliteDatabaseQuery implements DatabaseQuery
{
 
    private $connector;
 
    public function __construct(DatabaseConnect $connector) {
        $this->connector = $connector;
 
    }
 
    public function execute(string $query) {
        $this->connector->connection()->query("CREATE TABLE messages(id, text);");
        $this->connector->connection()->query($query);
    }
}
 
//Типы соединений
$mysql = new MysqlDatabaseFactory('127.0.0.1','root','','patterns');
$mysql->query()->execute("INSERT INTO `messages`(`text`) VALUES ('test')");
 
$sqlite = new SqliteDatabaseFactory('test.txt');
$sqlite->query()->execute("INSERT INTO `messages`(`text`) VALUES ('test')");