天天看點

學習筆記:設計模式之工廠模式

我目前正在做一個上傳下載下傳模版,上傳下載下傳功能要在一個類中實作,但兩個的參數是明顯不同的,是以要建立不同的執行個體,若使用構造函數建立上傳類和下載下傳類,感覺“表達”不是很清晰。于是我就想到用工廠模式在“類外”建立執行個體。這便是我學習工程模式的緣由,但是後來發現,這太大材小用了。畢竟工廠模式的真正精髓在于代碼可重用性。

網上的卻有很多優秀的文章,他們把工廠模式講得很清楚,很明白(比如這篇文章:http://www.cnblogs.com/poissonnotes/archive/2010/12/01/1893871.html#2605935)。但是卻很少有人說明工廠模式究竟有什麼用。而本文的宗旨就在于此。

一般的,我們将工廠模式分為三類:簡單工廠模式;工廠方法模式;抽象工廠模式。

簡單工廠模式:将産品的抽象出來。其實作方式分三步:

第一步:提取公共因子----方法或屬性,到”産品接口“(以接口或抽象類實作)。這裡說個題外話,C#的接口中不可包含字段,但是可以使用屬性,即有取值器和通路器。

第二步:建立産品類,基礎并實作”産品接口“。

第三步:建立工廠。工廠提供一個create方法來生産産品。該方法接收一個參數,然後根據這個參數決定具體生産哪個産品,然後利用向上轉型傳回”産品接口“。

第四步:調用。

比如:我們現在有一個音樂播放器,将來可能還要做一個視訊播放器。

1.把方法----播放,暫停,結束,快進,快退----抽取出來,放入媒體接口中。

2.建立音樂類,繼承并實作媒體接口。

3.建立媒體工廠,接收一個字元串,當為音樂時,建立音樂類,傳回媒體接口。否則抛出一個異常。

4.在音樂播放程式中使用媒體工廠執行個體化一個媒體接口,調用接口提供的方法。

OK,現在來看一下,将來做視訊播放器時需要做的工作。

1.copy媒體接口

2.建立視訊類,繼承并實作媒體接口。

3.copy媒體工廠。

4.修改媒體工廠,添加一個判斷,當參數為視訊時,建立視訊類,傳回媒體接口。

5.copy音樂播放代碼,将執行個體化時的參數該為視訊。

現在工廠模式的作用很明顯了,代碼重用,隻修改了少量的地方。

一個好的設計應該實作高内聚,低耦合。簡單工廠模式每次都必須修改工廠類,這是不合理的。為了解決這個問題,工廠方法模式應運而生。

相對于簡單工廠模式,工廠方法模式對工廠進行”提煉“,做出一個”工廠接口“(這兒推薦使用抽象類實作,畢竟接口不支援static方法)。

我們還是來看這個例子。

前兩步與簡單工廠模式相同,我們從第三步開始。

3.建立”媒體工廠接口“,規定傳回值為媒體接口。

4.建立音樂工廠,繼承并實作“媒體工廠接口”。

5.調用。

現在來看下,将來要做視訊播放器所要做的工作。

1.copy媒體接口。

2.建立視訊類,基礎并實作媒體接口。

3.copy“媒體工廠接口”。

4.建立視訊工廠,繼承并實作“媒體工廠接口”。

5.copy音樂播放器代碼,修改,将執行個體化工廠接口所用的類換為視訊工廠。

可以很明顯的看出,視訊播放器重用了音樂播放器的代碼,而且又很好的分離了出來,互不影響。

那麼,抽象工廠模式又是什麼呢?

它不過多一個層級關系而已,一個工廠可以生産多個互有關聯産品。說到底還是可以用簡單工廠或工廠方法模式來實作。但是做為好的設計,我們還是應該以工廠方法模式來實作,即将這個可以生産多個産品的工廠再次“提取”,做出一個“接口”。

繼續閱讀