昨天我試著說了我自己對工廠方法的看法。今天則說抽象工廠。 在昨天的帖子里面,針對一個Factory類,我們只是定義了一個CreateProduct(),類似的,我們還可以在工廠中定義CreateProduct1(),CreateProduct2()等等一系列的方法來創建一個跟這個工廠相關的產品系列。 一個例子就是一個BBS得權限設計。可以使用工廠方法來為權限部分設計一個統一的訪問界面。大家可以參考java的開源項目jive論壇。 今天我試著說抽象工廠模式(Abstract factory). 在設計模式中,抽象工廠模式是這樣定義的: 提供一個創建一系列相關和相互依賴對象的接口, 而無需制定他們具體的類。 在這里提到的一個創建一系列相關和相互依賴對象,指的就是工廠方法。那么創建一個工廠的接口,而不關心具體的工廠,這樣一種設計思路就是抽象工廠模式。抽象工廠模式可以讓我們在程序中通過使用不同的具體工廠來配置抽象工廠接口而替換一個新的產品系列。 也就是說,把工廠也抽象,不再是具體的類,而是一個工廠的接口,就變成了抽象工廠。 抽象工廠和工廠方法的區別我的感覺是非常細微。只是抽象工廠考慮的視角注重在一個產品的系列。而工廠方法則是某一個產品而言的。例如,你可以在某一個超類中定一個工廠方法并等待子類來覆蓋它,但是這個超類同時可以做別的事情。而在抽象工廠中,抽象工廠接口只有一個作用:定義創建一系列產品的方法系列。
但是,一個產品系列創建好以后,再想增加新的產品系列則變得很困難。因為抽象工廠接口已經定義,并且已經發布,那么不能改變接口中定義好的產品系列(也就是公共的一系列createProduct方法),否則會引起引用接口的客戶端代碼的改動。
|