最近在看工廠模式和抽象工廠模式,把深入php那本書的這一塊看了兩遍,可還是迷迷糊糊的,於是去問了度娘,我覺得有篇博文裡這麼說的很有道理:
工廠方法
工廠方法是針對每種產品提供一個工廠類別。透過不同的工廠實例來創建不同的產品實例。
在同一等級結構中,支援增加任意產品。
抽象工廠
抽象工廠是應對產品族概念的。比如說,每個汽車公司可能要同時生產轎車,貨車,客車,那麼每個工廠都要有創建轎車,貨車和客車的方法。
應對產品族概念而生,增加新的產品線很容易,但是無法增加新的產品。
具體見博文
簡而言之,工廠方法是生產同一等級的不同產品,而抽象工廠是生產不同的產品族,而往往抽象工廠中會用到工廠方法。
首先介紹一下工廠方法。
假設我有一個人事管理項目,它需要管理Appointment(預約)對象,被要求用BloggsCal或者MegaCal的格式來和他們交流預約,當然隨著時間的發展,要求的格式肯定會變多。 (在我看來這裡面的格式就相當於工廠模式中的產品啦)
在介面層級上我們可以定義出兩個類別。其一是需要一個把Appointment物件轉換成一個專有格式,把它命名為AppEncoder類別(產品product),另外一個需要管理員來取得這個編碼器,我們把它命名為CommsManager類別(創建者creator)。
接下來我們上程式碼了:
<code><span>abstract</span><span><span>class</span><span>ApptEncoder</span>{</span><span>abstract</span><span><span>function</span><span>encode</span><span>()</span>;</span> } <span><span>class</span><span>BloggsApptEncoder</span><span>extends</span><span>ApptEncoder</span>{</span><span><span>function</span><span>encode</span><span>()</span>{</span><span>return</span><span>"Appointment data encode in BloggsCal format \n"</span>; } } <span>abstract</span><span><span>class</span><span>CommsManager</span>{</span><span>abstract</span><span><span>function</span><span>getHeadText</span><span>()</span>;</span><span>abstract</span><span><span>function</span><span>getApptEncoder</span><span>()</span>;</span><span>abstract</span><span><span>function</span><span>getFooterText</span><span>()</span>;</span> } <span><span>class</span><span>BloggsCommsManager</span><span>extends</span><span>CommsManager</span>{</span><span><span>function</span><span>getHeadText</span><span>()</span>{</span><span>return</span><span>"BloggsCal header\n"</span>; } <span><span>function</span><span>getApptEncoder</span><span>()</span>{</span><span>return</span><span>new</span> BloggsApptEncoder(); } <span><span>function</span><span>getFooterText</span><span>()</span>{</span><span>return</span><span>"BloggsCal footer \n"</span>; } }</code>
這裡面我只寫了一個BloggsCal格式,相當於做了一個產品,如果再加入別的如MegaCal格式時只要繼承ApptEncoder類別和CommsManager類別就行了,這就是工廠方法。
但是有沒有發現這種模式形成了一種特殊的程式碼重複,而且可能會導致不必要的實例化,所以使用的時候要考慮清楚再使用工廠模式
下面介紹一下抽象工廠,
上面說過工廠模式是用來生產不同產品的而抽象工廠是用來生成不同產品族。那我們接著上個例子來看。
這時候專案不再滿足只有一個Appointment(預約)功能了,他需要增加Ttd(待辦事宜)和Contact(聯絡人)的功能,這就是增加產品族了,我把類別圖寫上來吧,省的寫程式了,而且也更清楚一些。
以上就介紹了php之工廠模式和抽象工廠,包括了方面的內容,希望對PHP教程有興趣的朋友有幫助。