<?php 
/**
 * 【工厂方法】
 * 之前 03.php 简单工厂,如果再增加一个oracle客户端,就需要再次修改服务端Factory的代码。
 * 在面向对象设计法则中,有一个重要的【开闭原则】———— 对于修改是封闭,对于扩展是开放的
 * 
 */

header("Content-type: text/html; charset=utf-8");

/*共同接口--连接数据库*/
interface db{
    function conn();
}
//工厂接口--创建数据库
interface Factory{
    function createDB();
}

/*服务端开发,面向上面的接口。(不知道将会被谁调用)*/
class dbmysql implements db{
    public function conn(){
        echo '04-连接上了mysql <br>';
    }
}
class dbsqlite implements db{
    public function conn(){
        echo '04-连接上了sqlite <br>';
    }
}

//定义多个工厂类,分别实现上面的工厂接口
class mysqlFactory implements Factory{
    public function createDB(){
        $db = new dbmysql();
        return $db->conn();
    }
}
class sqliteFactory implements Factory{
    public function createDB(){
        $db = new dbsqlite();
        return $db->conn();
    }
}

/* 客户端开发 */
$fact = new mysqlFactory(); 
$fact->createDB();

$fact = new sqliteFactory(); 
$fact->createDB();

////==== 假如现在新增 oracle的相关数据(前面的代码不用改):
class dboracle implements db{
    public function conn(){
        echo '04-连接上了oracle';
    }
}
class oracleFactory implements Factory{
    public function createDB(){
        $db = new dboracle();
        return $db->conn();
    }
}
//客户端调用
$fact = new oracleFactory();
$fact->createDB(); //输出“04-连接上了oracle”