編程中的那些套路——關於工廠模式

該文章屬於《編程中的那些經典套路——設計模式彙總》系列,而且如下內容基於語言PHPphp

前面咱們寫了簡單工廠模式,《編程中的那些套路——關於簡單工廠模式》,但簡單工廠模式有一些不足(違反開放封閉原則),因此須要設計出一套更加規範的設計模式。mysql

工廠模式就在這個情形下產生了。sql

此處以數據庫的選擇爲例子:數據庫

工廠模式算是對簡單工廠模式的一次升級,新增了一個工廠類接口(factory)。### 簡單工廠可沒有編程

經過對代碼的解耦生成了多個數據庫工廠類,這些數據庫工廠分別對應着一個實際的數據庫功能類,外界經過調用不一樣的工廠從而使用不一樣的類 。
###簡單工廠只有一個client類,具體選擇哪個數據庫類是經過 switch ($type) {case’condition’: } 代碼判斷的,若是須要新增數據庫或者減小數據庫的話,須要直接改寫好了的代碼,也就是在這裏違反了開閉原則。*segmentfault

看看代碼應該會清晰不少。設計模式

工廠模式.phporacle

<?php
 
//設定數據庫接口
 
interface Db{
 
    public function realwork();
 
}
 
//設定工廠接口
 
interface Factory{
 
    public function facWorking();
 
}
 
//MySQL實際功能類
 
class Mysql implements Db{
 
    public function realWork(){
 
        return '開始使用mysql';
 
    }
 
}
 
//Oracle
 
class Oracle implements db{
 
    public function realWork(){
 
        return '開始使用oracle';
 
    }
 
}
 
//NoSQL實際功能類
 
class Nosql implements db{
 
    public function realWork(){
 
        return '開始使用nosql';
 
    }
 
}
 
//對外展現的MySQL工廠類
 
class FacMysql implements factory{
 
    protected static $database;
 
    public function facWorking(){
 
        self::$database = new Mysql();
 
        return self::$database->realWork();
 
    }
 
}
 
//對外展現的Oracle工廠類
 
class FacOracle implements factory{
 
    protected static $database;
 
    public function facWorking(){
 
        self::$database = new Oracle();
 
        return self::$database->realWork();
 
    }
 
}
 
//對外展現的NoSQL工廠類
 
class FacNosql implements factory{
 
    protected static $database;
 
    public function facWorking(){
 
        self::$database = new Nosql();
 
        return self::$database->realWork();
 
    }
 
}
 
//如今我想實現MySQL數據庫的功能,可是我只須要調用MySQL的工廠類便可,我沒法而且也不必知道,實際類和方法的名字
 
$db = new facMysql();
 
print_r($db->facWorking()); //output:開始使用MySQL
 
?>

外部調用的時候,只須要選擇本身所須要的數據庫工廠便可,該工廠會去調用真實數據庫處理方法,而後返回你想要的結果。nosql

而當你想要更換數據庫的時候就很簡單了,只須要把 $db = new FacMysql();換成其餘的數據庫工廠就好了,想要Oracle數據庫的話就換成FacOracle()。設計

固然若是你看不懂工廠模式的話,那麼你能夠再看看簡單工廠模式,有助於你的理解

編程中的那些套路——關於簡單工廠模式

該文章屬於《編程中的那些經典套路——設計模式彙總》系列

相關文章
相關標籤/搜索