Design Patterns - Builder
阿新 • • 發佈:2020-12-10
Builder(生成器) — 物件建立型模式
將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
適用場景
- 建立複雜物件的演算法應該獨立於該物件的組成部分以及它們的裝配方式(注意,兩個重點)
- 當構造過程必須允許被構造的物件有不同的表示時。
優點
- 它可以使你改變一個產品的內部表示:因為產品的表示都封裝到Builder裡面,如果想替換產品的內部表示,只需替換Builder即可。
- 它將構造程式碼和表示程式碼分開。
- 它使你可對構造過程進行更精細的控制。
其他一些要考慮的實現問題:
- 裝配和構造介面:生成器逐步構造它們的產品。因此 Builder 類介面必須足夠普遍,以便為各種型別的具體生成器構造產品。一個關鍵的設計問題在於構造和裝配過程。構造請求的結果只是被新增到產品中,這樣是沒什麼問題的,但如果在一個構造介面中需要它前序構造請求的結果,這種情況下,生成器應該將前者的結果返回給導向器,然後導向器將他們回傳給生成器去建立父節點。
UML圖
示例
class Meal(object):
def __init__(self, food="", drink=""):
self.food = food
self.drink = drink
class MealBuilder(object):
meal = Meal()
def buildFood(self):
raise NotImplementedError
def buildDrink(self):
raise NotImplementedError
def getMeal(self):
return self.meal
class MealBuilderA(MealBuilder):
def buildFood(self):
self.meal.food = "薯條"
def buildDrink(self):
self.meal.drink = "可樂"
class MealBuilderB(MealBuilder):
def buildFood(self):
self.meal.food = "雞翅"
def buildDrink(self):
self.meal.drink = "檸檬果汁"
class KFCDirector:
def __init__(self, builder):
self.builder = builder
def construct(self):
self.builder.buildFood()
self.builder.buildDrink()
return self.builder.meal
client
director = KFCDirector(MealBuilderA())
meal = director.construct()
print(meal.food)
print(meal.drink)
print("*******************")
director.builder = MealBuilderB()
meal = director.construct()
print(meal.food)
print(meal.drink)
"""
output:
薯條
可樂
*******************
雞翅
檸檬果汁
"""