最近在看原廠模式和抽象原廠模式,把深入php那本書的這一塊看了兩遍,可還是迷迷糊糊的,於是去問了度娘,我覺得有篇博文裡這麼說的很有道理:
Factory 方法
Factory 方法是針對每一種產品提供一個工廠類。通過不同的工廠執行個體來建立不同的產品執行個體。
在同一等級結構中,支援增加任意產品。
抽象工廠
抽象工廠是應對產品族概念的。比如說,每個汽車公司可能要同時生產轎車,貨車,客車,那麼每一個工廠都要有建立轎車,貨車和客車的方法。
應對產品族概念而生,增加新的產品線很容易,但是無法增加新的產品。
具體見博文
簡而言之,Factory 方法是生產同一等級的不同產品,而抽象工廠是生產不同的產品族,而往往抽象工廠中會用到Factory 方法。
首先介紹一下Factory 方法吧。
假設我有一個人事管理項目,它需要管理Appointment(預約)對象,被要求用BloggsCal或者MegaCal的格式來和他們交流預約,當然隨著時間的發展,要求的格式肯定會變多。(在我看來這裡面的格式就相當於原廠模式中的產品啦)
在介面層級上我們可以定義出兩個類。其一是需要一個把Appointment對象轉化成一個專有格式,把它命名為AppEncoder類(產品product),另外一個需要管理員來獲得這個編碼器,我們把它命名為CommsManager類(建立者creator)。
接下來我們上代碼了:
abstractclassApptEncoder{abstractfunctionencode();}classBloggsApptEncoderextendsApptEncoder{functionencode(){return"Appointment data encode in BloggsCal format \n"; }}abstractclassCommsManager{abstractfunctiongetHeadText();abstractfunctiongetApptEncoder();abstractfunctiongetFooterText();}classBloggsCommsManagerextendsCommsManager{functiongetHeadText(){return"BloggsCal header\n"; } functiongetApptEncoder(){returnnew BloggsApptEncoder(); } functiongetFooterText(){return"BloggsCal footer \n"; }}
這裡面我唯寫了一個BloggsCal格式,相當於做了一種產品,如果再添加別的如MegaCal格式時只要繼承ApptEncoder類和CommsManager類就行了,這就是Factory 方法。
但是有沒有發現這種模式形成了一種特殊的代碼重複,而且可能會導致不必要的執行個體化,所以使用的時候要考慮清楚再使用原廠模式
下面介紹一下抽象工廠,
上面說過原廠模式是用來生產不同產品的而抽象工廠是用來產生不同產品族。那我們接著上個例子來看。
這時候項目不再滿足只有一個Appointment(預約)功能了,他需要增加Ttd(待辦事宜)和Contact(連絡人)的功能,這就是增加產品族了,我把類圖寫上來吧,省的寫代碼了,而且也更清楚一些。
').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('
').text(i)); }; $numbering.fadeIn(1700); }); });
以上就介紹了php之原廠模式和抽象工廠,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。