2013年9月28日 星期六

Abstract Factory 與 Factory Method 概念比較

前陣子和同事在聊 Factory 時有各講各的感覺,後來發現可能是有些在講 Abstract Factory,有些在講 Factory Method,故記錄一下自己的想法。

首先 Abstract Factory 我認為它適合用生成一組應用程式框架,如果它的生命週期和應用程式的開啟到結束是相當接近的會更有意義,當然如果縮小來看也不盡然要那麼講究生命週期,也可以在需要用到某個類別群時才以抽像方法來生成類別群及操作。

再來是 Factory Method,它的應用場合就我的理解,比較像是集中一群有共同介面的類別,並在抽像類別中提供生成函式而非直接調用類別的建構式,還有一種稱為 Simple Factory 類似的模式很類似 Factory Method 模式,而 Simple Factory 又稱為 Static Factory,它的特色就是生成函式所提供的會是具體類別所生成的物件,相較於 Factory Method 生成物件為抽像類別而言,Simple Factory 實作較簡單。

以 Android 為例,就像 BitmapFactory 類別,它具備 Simple Factory Pattern 所述的特色,不可建構,有多項明確的生成 Bitmap 的函式
可以參考 Android Developers 的文件:BitmapFactory

在 C# 中很常用的的 Color 類別,該類別也無法建構,但它提供了 FromArgb、FromKnownColor、FromName 來生成 Color 物件,這也是一個 Simple Factory 的例子
MSDN 文件:Color Struct

而在 .Net Framework 中有一個常見的 Factory Method 例子 WebRequest 類別,它沒有建構式,僅提供一個 Create Function 來生成繼承自 WebRequest 的子類別,例如 HttpWebRequest、HttpWebResponse 之類的都是可以借由 WebRequest.Create 產生出來的,而 WebRequest 本身是一個 Abstract Class
用法參考 MSDN 文件:WebRequest

簡單的結論我的想法,Abstract Factory 用於撰寫應用程式框架,各類別群之間往往實作細節差異很大,但介面相同,Factory Method 用於讓開發者更容易管理有共同介面的類別群,各衍生類別的實作細節差異不大,可能只是比基底抽像類別多做一些事或初始值不同,然後就可以把多做的這件事取個名為 CreateXXX 的 Function 來讓使用者更好識別又可以得到更擅常做某件事的物件,上面我附的文件都可以清楚的感覺到,Simple Factory 的作法相對簡單與目的單純,籍由 Method 的名稱更利於用戶清楚手上的資源適合用何種方式產生物件,而不是一堆又臭又長的 Overloading 建構式。

沒有留言:

張貼留言