l

2012年11月26日 星期一

Creational Patterns要解決什麼問題(下)?

Nov. 21 12:00~14:20

image

***

先打個廣告,原定11月24-25、12月1日舉辦的「Design Patterns這樣學就會了:入門實作班」,開課日期改到2013年1月19、20、26日(週六、週日、週六),想學好設計模式的鄉民們請多加利用。報名網址在這裡:http://www.accupass.com/go/pattern1211

***

終於要完成這系列的第三集,也是最後一集。前兩集的內容在這裡《Creational Patterns要解決什麼問題(上)?》與《Creational Patterns要解決什麼問題(中)?》,翹課的鄉民請自行找時間補課。

在第一集中提到在Java語言至少有以下9種方式來產生一個物件:

  1. 直接在需要產生物件的時候把物件給new出來,例如 List<String> list = new ArrayList<>();
  2. 用Reflection的方式來產生物件。
  3. 用clone(Prototype pattern)的方式來產生物件。
  4. 用Singleton pattern。
  5. 用Object Pool pattern。
  6. 用Simple Factory pattern。
  7. 用Factory Method pattern。
  8. 用Abstract Factory pattern。
  9. 用Builder pattern。

前兩集已經說明了前6種產生物件的方式,今天要介紹7、8、9這三種方式,以下簡單用一個圖來說明。

螢幕快照 2012-11-21 下午12.08.05

 

接下來討論一下,是何種Force導致我們選擇不同的Solution。

使用Factory Method

  • 在設計應用程式框架或類別庫時,框架本身會使用到某一種類別或介面,但是實作該種類別或介面的物件則是由使用這個框架的人所提供的。換句話說,在設計框架的階段你只知道所要產生物件的共同父類別或介面,但不知道所要產生物件的具體類別。
  • 為了降低系統的相依性,你希望物件的使用者不需要知道產生物件的過程,只需知道該物件是由誰負責產生即可。
  • 你所要使用的物件在不同的應用中,會由使用者(使用你的框架或是軟體的人)針對相同的類別或介面提供不同的實作。

使用Abstract Factory

  • 在設計應用程式框架或類別庫時,框架本身會使用到某一組類別或介面。在設計框架的階段你只知道所要產生物件的共同父類別或介面,但不知道所要產生物件的具體類別。
  • 每組組類別或介面的通常會有一種以上的實作,不同實作方式的組別物件不可同時交互使用。
  • 為了降低系統的相依性,你希望物件的使用者不需要知道產生物件的過程,只需知道該物件是由誰負責產生即可。
  • 實作該組類別或介面的物件通常是由框架開發者提供,但也可由使用者(使用你的框架或是軟體的人)自行擴充。

使用Builder

  • 你所要產生的物件是一個較為複雜的產品物件,這個產品物件需要經由若干個較小的零件(組件)物件所組合而成。換句話說,產生這個產品物件的過程需要經過好幾個步驟才能夠完成(不是直接把所要產生的物件給 new 出來就好了)。
  • 組合出這個複雜產品物件的步驟是固定的,但是產生各種不同零件物件的實作卻可以有很多種不同的方式。
  • 在設計階段你知道組裝產品物件的步驟以及個別組件物件的介面,但是不知道產生這些零件物件的具體類別。

***

以上說明如果原本已經知道這幾個設計模式的鄉民應該一看就懂,不知道的鄉民再怎麼看可能還是看不懂 挑眉質疑。總之,最後補充幾點:

  • 在GoF的書中,Factory Method和Abstract Factory的例子都是應用在開發應用程式框架(application framework)或是類別庫(class library)。後來坊間的一些書籍或是網路上的範例,有些例子,特別是Factory Method的例子,只強調「用ConcreteCreator產生ConcreteProduct這樣的一組物件對應關係」,但卻沒有特別強調當初GoF書中是因為要設計一個應用程式框架,所以才要求使用者繼承自應用程式框架然後自行實作ConcreteCreator與ConcreteProduct。之後應用程式框架將會透過使用者提供的ConcreteCreator來產生使用者自行實作的ConcreteProduct。如果沒有這一層的需求(應用程式框架透過ConcreteCreator獲得使用者自行提供的ConcreteProduct並加以操作),那麼在許多情況下,直接使用SimpleFactory會比較簡單。
  • 除了Builder以外,其他幾種產生物件的方法,所要產生的物件本身,都是一個獨立的個體,產生之後就可以使用了。但有時候要產生的物件比較複雜,需要由較小的物件,經過若干步驟才可以產生(組裝)完畢,而且這些產生較小物件的方法還可能依據需求不同而有所不同,此時便可考慮使用Builder。

***

友藏內心獨白:看完這三集應該對於產生物件的方法與時機更加了解了吧。

沒有留言:

張貼留言