1. 程式人生 > 實用技巧 >php設計模式-介面工廠模式

php設計模式-介面工廠模式

<?php
//------------------------------簡單介面
// 共同介面
interface db 
{
    function conn();
}

// 服務端開發不知道將會被誰呼叫
class mysql implements  db
{
    public function conn()
    {
        echo  '連線mysql';
    }
}

class sqlit implements db
{
    public function conn()
    {
        echo '連線sqlit';
    }
}

// 客戶端看不到mysql,sqlit內部細節,根據文件只清楚有兩個介面
$db = new mysql;
$db->conn();  //連線mysql

$db = new sqlit;
$db->conn(); //連線sqlit

// --------------------------簡單工廠
class Factory
{
    public static function createDb($type)
    {
        return new $type;
    }
}

// 客戶端呼叫現在不知道有哪些類名,只知道介面支援mysql,sqlit,
// 提供了Factory::createDb方法,只要傳資料庫名稱,就可以得到例項
$db = Factory::createDb('mysql');
$db->conn(); // 連線mysql

/**
 * 新增oracle資料庫?
 * 在c++和java中修改程式碼要增加編譯的成本,不符合增開增開修閉原則
 */

 //----------------------------- 抽象工廠

 interface dbFactory 
 {
     public function createDb();
 }

 class mysqlFactory implements dbFactory
 {
     public function createDb()
     {
         return new mysql();
     }
 }

 class sqlitFactory implements dbFactory
 {
    public function createDb()
    {
        return new sqlit();
    }
 }

 // 客戶端開始呼叫包
 $mysqlFactory = new mysqlFactory();
 $mysql = $mysqlFactory->createDb();  
 $mysql->conn();

 $sqlitFactory = new sqlitFactory();
 $sqlit = $sqlitFactory->createDb();
 $sqlit->conn();

 // 新增oracle只要新增oracle工產,和oracle資料庫類,避免對原有程式碼的修改
 class oracle implements db
 {
    public function conn()
    {
        echo '連線oracle';
    }
 }

 class oracleFactory implements dbFactory
 {
     public function createDb()
     {
         return new oracle;
     }
 }

 $oracleFactory = new oracleFactory();
 $oracle = $oracleFactory->createDb();
 $oracle->conn();