該文章屬於《編程中的那些經典套路——設計模式彙總》系列,而且如下內容基於語言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()。設計
固然若是你看不懂工廠模式的話,那麼你能夠再看看簡單工廠模式,有助於你的理解
該文章屬於《編程中的那些經典套路——設計模式彙總》系列