簡單工廠模式實現了產品類的代碼跟客戶端代碼分離,但會有一個問題,優秀的代碼是符合「開閉原則」若是你要加一個C類產品,你就要修改工廠類裏面的代碼,也就是說要增長條件語句如:switch---case。對於這個問題,接下來的工廠方法模式能夠解決這個問題。php
工廠方法就是爲配一個產品提供一個獨立的工廠類,經過不一樣的工廠實例來建立不一樣的產品實例。mysql
//抽象產品類 abstract class DataBase { abstract function connect(); abstract function getOne(); } //具體產品類 class MySql extends DataBase { function connect() { return "MySQL鏈接對象返回"; } function getOne() { return "MySQL返回查詢結果"; } } //具體產品類 class SqlServer extends DataBase { function connect() { return "SQL Server鏈接對象返回"; } function getOne() { return "SQL Server返回查詢結果"; } }
//抽象工廠類 abstract class FactoryDataBase{ function createDataBase(){} } //具體工廠類 class FactoryMySql extends FactoryDataBase { public function createDataBase() { return new MySql(); } } //具體工廠類 class FactorySqlServer extends FactoryDataBase { public function createDataBase() { return new SqlServer(); } }
$mysql = new FactoryMySql(); $db1 = $mysql->createDataBase();
工廠方法模式彷彿已經把對象的建立進行了很完美的包裝,使得客戶程序中僅僅處理抽象產品角色提供的接口。那咱們是否必定要在代碼中遍及工廠呢?大可沒必要。也許在下面狀況下你能夠考慮使用工廠方法模式:sql