使用工廠模式的目的或目標?
工廠模式的最大優點在於建立物件上面,就是把建立物件的過程封裝起來,這樣隨時可以產生乙個新的物件。
減少**進行複製粘帖,耦合關係重,牽一發動其他部分**。
通俗的說,以前建立乙個物件要使用new,現在把這個過程封裝起來了。
假設不使用工廠模式:那麼很多地方呼叫類a,**就會這樣子建立乙個例項:new a(),假設某天需要把a類的名稱修改,意味著很多呼叫的**都要修改。
工廠模式的優點就在建立物件上。
工廠模式的優點就在建立物件上。建立乙個工廠(乙個函式或乙個類方法)來製造新的物件,它的任務就是把物件的建立過程都封裝起來,
建立物件不是使用new的形式了。而是定義乙個方法,用於建立物件例項。
每個類可能會需要連線資料庫。那麼就將連線資料庫封裝在乙個類中。以後在其他類中通過類名:
為什麼引入抽象的概念?
想一想,在現實生活中,當我們無法確定某個具體的東西的時候,往往把一類東西歸於抽象類別。
工廠方法:
比如你的工廠叫做「香菸工廠」,那麼可以有「七匹狼工廠」「中華工廠」等,但是,這個工廠只生廠一種商品:香菸;
抽象工廠:無法描述它到底生產什麼產品,它生產很多態別的產品(所以抽象工廠就會生成子工廠zlzvyc)。
你的工廠是綜合型的,是生產「一系列」產品,而不是「乙個」,比如:生產「香菸」,還有「啤酒」等。然後它也可以有派生出來的具體的工廠,但這些工廠都是生產這一系列產品,只是可能因為地域不一樣,為了適應當地人口味,味道也不太一樣。
工廠模式:理解成只生成一種產品的工廠。比如生產香菸的。
工廠方法:工廠的一種產品生產線 。比如鍵盤的生成過程。
別人會反駁:吃飽了沒事幹,一定要修改類名稱呢?這個說不定。一般都不會去修改類名稱。
其實工廠模式有很多變體,抓住精髓才是關鍵:只要是可以根據不同的引數生成不同的類例項,那麼就符合工廠模式的設計思想。
這樣子讓我聯想到框架中經常會有負責生成具體類例項的方法供呼叫。
由於前面使用過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
else
}}dbfactory::factory("mysql");
dbfactory::factory("oracle");
在thinkphp框架中也有對應的實現:
db.class.php就是乙個工廠類(也可以叫做資料庫中間層,之所以叫做中間層,是因為可以操作mysql、oracle等各資料庫。而這個類就是中間層作用,遮蔽掉具體的實現。讓程式設計師可以不改動原來的查詢**。中間層來對接mysql、oracle等資料庫。
db.class.php中有個factory()方法來建立不同的資料庫例項
public function factory($db_config='') else
// 檢查驅動類
if(require_cache($path.'driver/db/'.$class.'.class.php')) else
return $db;
}還有做支付介面的時候,未來可能對應不同的支付閘道器:支付寶、財付通、網銀**等。方便未來擴充套件,設計成工廠模式。定乙個專門生產閘道器介面的工廠,抽象出來,做成介面形式,讓所有的子類都要實現它的介面。以後加乙個支付方式,要使用哪一種支付方式,改變一下引數即可。
書籍程式設計》(英文名稱為php 5 power programming)也提到乙個工廠模式的例子,學到程式設計客棧一招:在為使用者註冊的時候,分為很多種角色的使用者。比如冊使用者,匿名使用者、管理員使用者等。完全使用可以使用工廠的思想來實現,**也容易維護,為每種角色可以生成操作的類。
定義以下幾個類:
use***ctory 使用者工廠類,負責生成不同的使用者類
user:使用者類的基類,所有使用者類都是繼承這個類
zlzvyc不同角色的類:註冊使用者類、匿名使用者類、管理員使用者類
總結結束,歡迎指正!
設計模式之工廠模式例項
最近公司業務拓展需要對接網際網路醫院,針對數量繁多的醫院且每家醫院的要求各不一樣,每次新增醫院都會改動到之前的方法,增加條件判斷,導致需要測試全量回歸,迭代效率低下,為此結合軟體設計的開閉原則 擴充套件開放 修改關閉 引入設計模式對 進行優化,記錄下來。希望對剛碰到類似問題的朋友有幫助。查詢病歷記錄...
PHP設計模式之抽象工廠模式例項分析
前面的文章程式設計客棧說了php下的簡單工廠 靜態工廠 和工廠模式,現在說一下抽象工廠模式 工廠模式我們已經說過,增加乙個產品很簡單,增加對應的產品類和工廠類,不需要對原有 進行改動,符合開閉原則 現在接著上篇文章,我們又有了新的需求,我們要求蘋果味飲料和香蕉味飲料,有百事和可口可樂兩個品牌,用工廠...
php設計模式之工廠模式
一直都對php的設計模式有著一種特殊的 情結 從最開始接觸到的單例模式,到經典的mvc設計模式,每次的接觸都讓我為之驚奇。買了本php設計模式在家看,發現,都是專有名詞,再加上太專業的術語,讓我沒有看下去的勇氣。無意之中逛論壇,發現乙個部落格,關於php的五種設計模式,其中就有工廠模式。看完後,第一...