使用工廠模式的目的或目標?
工廠模式的最大優點在於創建物件上面,就是把創建物件的過程封裝起來,這樣隨時可以產生一個新的物件。
減少代碼進行複製黏帖,耦合關係重,牽一發動其他部分代碼。
通俗的說,以前創建一個物件要使用new,現在把這個過程封裝起來了。
假設不使用工廠模式:那麼很多地方呼叫類別a,程式碼就會這樣子創建一個實例:new a(),假設某天需要把a類別的名稱修改,表示很多呼叫的程式碼都要修改。
工廠模式的優點就在創建物件上。
工廠模式的優點就在創建物件上。建立一個工廠(一個函數或一個類別方法)來製造新的物件,它的任務就是把物件的創建過程都封裝起來,
創建物件不是使用new的形式了。而是定義一個方法,用來建立物件實例。
每個類別可能會需要連接資料庫。那麼就將連接資料庫封裝在一個類別中。以後在其他類別中透過類別名稱:
為什麼引入抽象的概念?
想一想,在現實生活中,當我們無法確定某個具體的東西的時候,往往把一類東西歸於抽象類別。
工廠方法:
例如你的工廠叫做“香煙工廠”,那麼可以有“七匹狼工廠”“中華工廠”等,但是,這個工廠只生廠一種商品:香煙;
抽象工廠:無法描述它到底生產什麼產品,它生產很多類型的產品(所以抽象工廠就會生成子工廠)。
你的工廠是綜合型的,是生產“一系列”產品,而不是“一個”,例如:生產“香煙”,還有“啤酒”等。然後它也可以有衍生出來的具體的工廠,但這些工廠都是生產這一系列產品,只是可能因為地理不一樣,為了適應當地人口味,味道也不太一樣。
工廠模式:理解成只生成一種產品的工廠。比如生產香煙的。
工廠方法:工廠的一種產品生產線 。比如鍵盤的生成過程。
別人會反駁:吃飽了沒事幹,一定要修改類別名稱呢?這個說不定。一般都不會去修改類別名稱。
其實工廠模式有很多變體,抓住精髓才是關鍵:只要是可以根據不同的參數產生不同的類別實例,那就符合工廠模式的設計思想。
這樣子讓我聯想到框架中常常會有負責產生具體類別實例的方法供呼叫。
由於前面使用過phpcms,用phpcms的來幫助理解,更加好,如下:
pc_base:load_app_class("order"');//參數名稱就是類別名稱。將會產生得到order這個實例。傳遞不同的參數得到不同的類別實例,這就符合工廠模式。
pc_base:load_app_class("comment"');//產生一個comment類別實例
//當然load_app_class這個方法裡面還會結合了單件模式的想法。避免呼叫n次,就重複建立n個相同的實例
工廠模式我想到的一個典型的應用就是:php可能要連結mysql,也可能要連結sqlserver,還有其他什麼資料庫。那麼要做一個抽象的資料庫類,
這個類就是一個工廠類,專門負責產生不同的物件。
這樣子做很方便擴充。我們在直接連結資料庫的時候,不是使用程式碼new Mysql($host,$username,$password,$dbname)的形式
而可以動態產生一個連接資料庫的實例。可以是mysql,也可以是連接oracle的。
class DbFactory
{
function static factory($db_class_name)
{
$db_class_name = str.lower($ 'Drivers/' . $db_class_name . '.php') {
$classname = 'Driver_' . $db_class_name;
return new $db_class_name;
}
}
}
DbFactory::factory("mysql");
DbFactory::factory("oracle");
在thinkphp框架中也有對應的實作:
Db.class.php就是一個工廠類別(也可以叫做資料庫中間層,之所以叫做中間層,是因為可以操作mysql、oracle等各資料庫。 mysql、oracle等資料庫。public function factory($db_config='') {
// 讀取資料庫設定
$db_config = $this->parseConfig($db_config); throw_exception(L ('_NO_DB_CONFIG_'));
// 資料庫型別
$this->dbType = ucwords(str約n($db_config['dbms'])); if( is_file(CORE_PATH.'Driver/Db/'.$class.'.class.php')) {
// 內建驅動程式
$path = EXTEND_PATH;
}
// 檢查驅動類別
if(require_cache($path.'Driver/Db/'.$class.'.class.php // 取得目前的資料庫類型
if( 'pdo' != strtolower($db_config['dbms']) )
else
$db->dbType = $this- >_getDsnType($db_config['dsn']);
if(APP_DEBUG) $db->debug = true 沒有定義
throw_exception(L('_NOT_SUPPORT_DB_').': ' . $ 。方便未來擴展,設計成工廠模式。定一個專門生產網關介面的工廠,抽像出來,做成介面形式,讓所有的子類別都要實現它的介面。以後加一個支付方式,要用哪一種支付方式,改變一下參數即可。
書籍
定義以下幾個類別:
UserFactory 用戶工廠類,負責產生不同的使用者類別
User:使用者類別的基底類,所有使用者類別都是繼承這個類別
不同角色的類別:註冊使用者類別、匿名用戶類別、管理者使用者類別
更多php設計模式總結-工廠模式相關文章請關注PHP中文網!