到目前為止,我們已經學習了五種建立型模式中的四種,它們分別是單例模式、工廠方法模式、抽象工廠模式和原型模式。不同的模式適用的的應用場景有所不同,但也並不是完全隔絕,需要使用者根據具體的應用場景選擇合適的模式。本文將介紹建立型模式中的最後一種,即建造者模式,並通過**的方式進行闡述,同時和之前的幾種模式做下對比。1. 前言
如果希望程式在整個過程中只有乙個物件例項,那麼單例模式中幾種執行緒安全的形式是不錯的選擇;如果同一型別的產品有很多,而且希望新增該型別的產品而不需要修改之前的程式,同時希望使用者不需要了解產品的細節,那麼可以使用工廠方法模式;如果生產的不只是同一型別的產品,而是希望可以生產同一產品族中不同型別的產品,工廠方法模式的進一步抽象對應的抽象工廠模式是更好的選擇,它不僅可以滿足開閉原則,而且可以對同一產品族下的產品進行約束。
如果某型別產品本身具有一定的約束規則,但是根據不同的操作步驟會有多種多樣的實現形式,那麼建造者模式相較於上述的幾種就是乙個更好的選擇。如何理解使用建造者模式的緣由呢?下面我們通過生活中的乙個例子來進行理解:
由於本人很喜歡做飯,所以就拿做菜的例子來說一下~做菜大致可以分為買菜、洗菜、切菜、做菜、擺盤和驗菜等幾個步驟,當然不同的菜的做法會有不同的操作步驟和其他更為細化的操作。為了表示做菜所包含的一些步驟,首先建立乙個抽象類,類中的抽象方法分別表示每個步驟:
public
abstract
class
cooking
假設現在店裡只有乙個廚師,而且店裡只提供一種餐品,那麼表示廚師的類chef就需要繼承cooking並重寫其中的抽象方法,同時類中還應實現表示做菜流程的方法,如下所示:
public
class
chef
extends
cooking
@override
public
void
cut(
)@override
public
void
cook()
@override
public
void
check()
public
void
make()
}
對於顧客來說,他的選擇是唯一的。因此,當他想要點餐時,只需要告訴廚師做乙份即可。
public
class
consumer
}
這樣的方法具有以下的特點:
2. 建造者模式
如果此時餐廳做大做強了,菜品得到了極大的豐富,不僅有各種各樣的中餐,同時還提供多種西餐進行選擇。為了抽象表示所有的餐品,首先建立乙個餐品類meal,它包含名字和**兩個屬性
public
class
meal
public
meal
(string name)
public string getname()
public
void
setname
(string name)
public
intgetprice()
public
void
setprice
(int price)
}
雖然中餐和西餐品類繁多,不同的菜做法各有不同,但仍然具有很多相似的操作,假設所有的菜的操作步驟只有買、切、片、做和驗這幾種:
public
abstract
class
chef
}
同時抽象類chef中還有方法make()
表示出菜。
那麼做中餐和西餐的廚師類都需要繼承chef,不過在具體的操作步驟上有所不同。假設中餐廚師擅長做烤魚,那麼做法包含買魚、切魚、片魚、做魚和驗菜。
public
class
chinesechef
extends
chef
@override
public
void
cut(
)@override
public
void
slice()
@override
public
void
cook()
@override
public
void
check()
}
而西廚更擅長做牛排,假設牛排只需要買回來進行烹飪,最後驗菜即可。
public
class
westchef
extends
chef
@override
public
void
cut(
)@override
public
void
slice()
@override
public
void
cook()
@override
public
void
check()
}
因為餐廳中廚師很多,為了方便後廚的管理工作,通常需要安排乙個主廚來負責做菜的整體流程。主廚只需要知道要做的菜品的名字,然後安排相應的二廚去做即可,當菜做完後只需要告訴服務員走菜。
public
class
majorchef
public meal direct()
}
此時,顧客想要點烤魚,那麼他只需要讓服務員告訴主廚菜名,主廚就會安排負責中餐的二廚來做。
public
class
consumer
}
buying fish...
cutting fish...
slicing fish...
cooking fish...
checking fish...
如果另乙個顧客點了牛排,主廚就會安排負責西餐的二廚去做。
public
class
consumer
}
buying steak...
cooking steak...
checking steak...
這裡採用的設計模式就是建造者模式,使用者只需要知道自己想吃什麼,而不需關心菜是怎麼做的。下面我們對照例子來理解建造者模式中的角色:
對應於上面的例子,角色對應的類圖如下所示:
4. 總結
建造者模式具有如下的特點:
抽象工廠模式 vs 建造者模式:
抽象工廠模式和建造者模式都實現了產品和生成過程的解耦,不過兩者之間仍存在一定的不同之處,例如:
設計模式 建造者模式
在gof的23種設計模式中對builder pattern的定義是 將乙個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。從程式角度來說,就是在基類定義某種事物建立的過程或業務流程,在子類進行重寫或是使用基類方法。這樣建立出來的例項不會因為過程或流程的丟失而使業務失敗。舉例來說,...
設計模式建造者模式
今天看了乙個設計模式。總結下,以免忘了。如何引入建造者模式的呢?作者舉了個例子。建造小人。當然需要 頭,左手,右手,左腳,右腳,軀幹。建造的過程使用 使用類裡面的方法就行了。但是如果需要乙個胖的小人,乙個瘦的小人呢?就需要重新構造乙個胖人類,乙個瘦人類。當然 使用者還需要自己處理構造的過程。這樣 就...
設計模式 建造者模式
定義 將乙個複雜的物件的構建與它的表示分離,是的同樣的構建過程可以建立不同的表示。包括的要素 1 產品類 2 抽象建造者或者介面 3 建造者 4 導演類 建造者模式的優點 首先,建造者模式的封裝很好,使用建造者模式可以有效地封裝變化,注意在使用建造者模式的場景中,一般產品類和建造者介面是比較穩定的,...