建造者模式是爲了在編寫代碼的時候防止我們有些方法忘記實現,例如我們要繪製一個人的圖形,我們需要繪製頭、身體、手和腳,可能我們在繪製的時候忘記給這個人畫手了,建造者模式就是爲了防止這種情況的發生而設計的,這種關係有點像是java中的接口類,子類必須實現接口中定義的所有方法,不然就會報錯,通過這種方法,所有實現畫人的類都必須實現畫人的接口類中的方法,不會遺漏任何一個方法。
這裏參考了《大話設計模式》中的例子
from abc import abstractmethod, ABC
'''畫圖類'''
class Pen:
def draw_head(self, size):
print('畫'+size+'大小的頭')
def draw_body(self, size):
print('畫'+size+'大小的身體')
def draw_arms(self, size):
print('畫'+size+'大小的手')
def draw_legs(self, size):
print('畫'+size+'大小的腿')
'''建造者抽象類'''
class PersonBuilder(ABC):
@abstractmethod
def build_head(self):
pass
@abstractmethod
def build_body(self):
pass
@abstractmethod
def build_arms(self):
pass
@abstractmethod
def build_legs(self):
pass
'''畫一個瘦子'''
class PersonThinBuilder(PersonBuilder):
def __init__(self, pen):
self.p = pen
def build_head(self):
self.p.draw_head('10')
def build_body(self):
self.p.draw_body('10')
def build_arms(self):
self.p.draw_arms('10')
def build_legs(self):
self.p.draw_legs('10')
'''指揮者,控制建造過程'''
class PersonDirector:
def __init__(self, pb):
self.pb = pb
def create_person(self):
self.pb.build_head()
self.pb.build_body()
self.pb.build_arms()
self.pb.build_legs()
if __name__ == '__main__':
pen = Pen()
pb = PersonThinBuilder(pen)
person = PersonDirector(pb)
person.create_person()
這裏通過創建一個PersonDirector
的類用來管理創建過程,上面給出了畫一個瘦子的例子,如果我們想要畫一個胖子怎麼辦,這個時候我們可以創建一個畫胖子的類PersonFatBuilder
,然後將其作爲參數傳遞給PersonDirector
類,即可以畫出一個胖子,在這個過程中我們沒有修改原來的代碼,符合軟件設計過程中的開閉原則。
from abc import abstractmethod, ABC
'''畫圖類'''
class Pen:
def draw_head(self, size):
print('畫'+size+'大小的頭')
def draw_body(self, size):
print('畫'+size+'大小的身體')
def draw_arms(self, size):
print('畫'+size+'大小的手')
def draw_legs(self, size):
print('畫'+size+'大小的腿')
'''建造者抽象類'''
class PersonBuilder(ABC):
@abstractmethod
def build_head(self):
pass
@abstractmethod
def build_body(self):
pass
@abstractmethod
def build_arms(self):
pass
@abstractmethod
def build_legs(self):
pass
'''畫一個瘦子'''
class PersonThinBuilder(PersonBuilder):
def __init__(self, pen):
self.p = pen
def build_head(self):
self.p.draw_head('10')
def build_body(self):
self.p.draw_body('10')
def build_arms(self):
self.p.draw_arms('10')
def build_legs(self):
self.p.draw_legs('10')
'''畫一個胖子'''
class PersonFatBuilder(PersonBuilder):
def __init__(self, pen):
self.p = pen
def build_head(self):
self.p.draw_head('20')
def build_body(self):
self.p.draw_body('20')
def build_arms(self):
self.p.draw_arms('20')
def build_legs(self):
self.p.draw_legs('20')
'''指揮者,控制建造過程'''
class PersonDirector:
def __init__(self, pb):
self.pb = pb
def create_person(self):
self.pb.build_head()
self.pb.build_body()
self.pb.build_arms()
self.pb.build_legs()
if __name__ == '__main__':
pen = Pen()
pb = PersonThinBuilder(pen)
person = PersonDirector(pb)
person.create_person()
pb2 = PersonFatBuilder(pen)
person2 = PersonDirector(pb2)
person2.create_person()