在大的應用中如果每需要得到一個對象都要自己去new,程序的業務邏輯就很混亂,統一由工廠創建,便於管理和擴展。工廠模式主要針對的多態,如果該類可能有很多派生,使用工廠模式比較方便。工廠模式一般可以分爲三類:簡單工廠模式、工廠方法模式和抽象工廠模式。
簡單工廠模式:
zf代碼實例:
class Zend_Db
{
//更具傳人的apdater參數覺得實例化相應的db
public static function factory($adapter, $config = array())
{
if ($config instanceof Zend_Config) {
$config = $config->toArray();
}
/*
* Convert Zend_Config argument to plain string
* adapter name and separate config object.
*/
if ($adapter instanceof Zend_Config) {
if (isset($adapter->params)) {
$config = $adapter->params->toArray();
}
if (isset($adapter->adapter)) {
$adapter = (string) $adapter->adapter;
} else {
$adapter = null;
}
}
......
return $dbAdapter;
}
}
客戶端可以通過傳人蔘數向簡單工廠發出要實例化那個產品實例的命令,一個工廠可以創造出多種產品。但它的缺點是客戶端需要知道工廠內部的少量實現細節(具體的參數),另外當要增加新的產品的時候,需要改變工廠類中的代碼,違反了開閉原則。工廠方法模式:
工廠方法模式爲了解決簡單工廠模式所遇到的缺點,把實例化產品的方法延遲的子類中。父類或者是接口定義了創建產品的方法,但是它並不知道具體的實現,具體的實現在它的下一層類中,調用哪個具體的工廠內交給了客戶端,這樣的好處是如果需要添加新產品不用修改父類的代碼,直接擴展相應產品對於的工廠類即可。
工廠方法的缺點也非常清楚,需要寫太多的工廠類。
工廠方法模式在php框架中很少見,在java的spring中倒是用的很多。
抽象工廠模式:
在實際中,一個工廠有可能不只生產一種產品,抽象工廠模式對於這種情況,每個工廠中有多個創建產品的方法,在應用中一般情況下這些產品類應該屬於同一系列。