code

2017年10月25日 星期三

Design Patterns 1 - Creational Patterns

軟體工程中的食譜

業界專家行之有年的經驗證明出這些patterns是經常性出現的設計難題的最好解答,所以是很實用的。

工程師之間了解design patterns的話,溝通也更精準,例如"這邊使用一個singleton pattern"。


Gang of Four

總共有23種,分成以下幾類:
1. creational patterns: 講述如何製造物件
2. structural patterns: 講述物件之間的關係
3. behavioral patterns: 講述物件間的責任,如何達成common goal

類別沒有那麼清楚,也是有模糊空間。


Singleton Pattern

某個class只能創造唯一一個instance,這種creational pattern稱為Singleton。
通常用在一個globally accessible object,而且合理的只能存在唯一的instance,例如系統的preference。

implementation可以簡單的利用private constructor,以及private static instance variable:



至於globally accessible的部分,就在於提供了一個class method來得到這個private instance variable。

另外這邊也用到了lazy creation,這對instance creation非常耗resource的class來說是個節省資源的好方法。

注意! 上面的implementation不是thread-safe,當多個thread嘗試獲取這個singleton instance的時候,race condition就會產生,單純對getInstance()做synchronization保護的話,只能保護object creation是synchronized,但不能確保這個singleton屬性的改變是thread-safe。


Factory Object Pattern (Not GoF pattern!)

簡單來說就是讓client把建立object 的責任delegate出去給一個factory object,在client選型號之後,一個工廠object就把東西丟出來給client,以下面例子:


這個pattern依賴subclassing,而顧客指定的型號就是各種不同的subclasses,真正創建一個class instance的過程稱為concrete instantiation。

client使用方式如下:



優點: 工廠新增或是刪除或是改變instantiation的方式,都不會動到client code。

限制: 不過client只能面對base class interface,舉例來說,各種Knife的subclass都被client用Knife type variable去承接,除非約定好工廠出來的東西一定是那個subclass,那就可以利用type casting去安全使用之。



Factory Method Pattern

Factory Method pattern不使用一個工廠物件來製造商品,而是在商品的abstract base class定義了一個abstract factory method,所有的concrete sublcasses都得implement這個factory method,所以把製造細節留給subclasses去決定,其實就是一般OOP的概念。




沒有留言:

張貼留言