github地址:https://github.com/cheesezh/python_design_patternspython
用程序模擬一個畫小人的過程,要求小人要有頭,身子,左手,右手,左腳,右腳。git
class PersonDrawer(): def draw(self): print("畫頭") print("畫身子") print("畫左手") print("畫右手") print("畫左腳") print("畫右腳") def main(): drawer = PersonDrawer() drawer.draw() main()
畫頭 畫身子 畫左手 畫右手 畫左腳 畫右腳
再畫一個身子胖一些的小人。github
class FatPersonDrawer(): def draw(self): print("畫頭") print("畫身子(胖一些)") print("畫左手") print("畫右手") print("畫右腳") def main(): drawer = FatPersonDrawer() drawer.draw() main()
畫頭 畫身子(胖一些) 畫左手 畫右手 畫右腳
畫胖一些的小人時候,稍不注意,漏掉了左腳。畫小人的步驟很繁瑣,稍不注意就會漏掉一步,致使小人缺胳膊少腿。最好的辦法就是規定,建造小人的時候,必需要有頭,身子,左手,右手,左腳,右腳。這時候就能夠使用建造這模式。算法
建造小人的過程
是穩定的,都須要頭身手腳,可是具體建造的細節
是不一樣的,高矮胖瘦都有。函數
爲了將一個複雜的對象的構建
與它的表示
分離,使得一樣的構建
過程能夠建立不一樣的表示
,就能夠使用建造者模式,又叫「生成器模式」。ui
實現的方法就是定義抽象的建造者類,經過抽象函數的方法把構建的過程固定下來,這樣就每一步也不能少,不會出現缺胳膊少腿的狀況了。code
from abc import ABCMeta, abstractmethod class PersonBuilder(): """ 抽象建造者,定義建立對象各個部件的接口 """ __metaclass__ = ABCMeta @abstractmethod def draw_head(self): pass @abstractmethod def draw_body(self): pass @abstractmethod def draw_left_arm(self): pass @abstractmethod def draw_right_arm(self): pass @abstractmethod def draw_left_leg(self): pass @abstractmethod def draw_right_leg(self): pass class ThinPersonBuilder(PersonBuilder): """ 具體建造者,實現建立各個部件的接口 """ def draw_head(self): print("畫頭——瘦小人") def draw_body(self): print("畫身子——瘦小人") def draw_left_arm(self): print("畫左手——瘦小人") def draw_right_arm(self): print("畫右手——瘦小人") def draw_left_leg(self): print("畫左腿——瘦小人") def draw_rihgt_leg(self): print("畫右腿——瘦小人") class FatPersonBuilder(PersonBuilder): """ 具體建造者,實現建立各個部件的接口 """ def draw_head(self): print("畫頭——胖小人") def draw_body(self): print("畫身子——胖小人") def draw_left_arm(self): print("畫左手——胖小人") def draw_right_arm(self): print("畫右手——胖小人") def draw_left_leg(self): print("畫左腿——胖小人") def draw_rihgt_leg(self): print("畫右腿——胖小人") class PersonDirector(): """ 指揮者,是構建一個使用Builder接口的對象 """ def __init__(self, person_builder): self.person_builder = person_builder def create_person(self): self.person_builder.draw_head() self.person_builder.draw_body() self.person_builder.draw_left_arm() self.person_builder.draw_right_arm() self.person_builder.draw_left_leg() self.person_builder.draw_right_leg() def main(): thin_person_builder = ThinPersonBuilder() thin_person_director = PersonDirector(thin_person_builder) thin_person_director.create_person() fat_person_builder = FatPersonBuilder() fat_person_director = PersonDirector(fat_person_builder) fat_person_director.create_person() main()
畫頭——瘦小人 畫身子——瘦小人 畫左手——瘦小人 畫右手——瘦小人 畫左腿——瘦小人 畫頭——胖小人 畫身子——胖小人 畫左手——胖小人 畫右手——胖小人 畫左腿——胖小人
建造者模式的好處就是使得建造代碼與表示代碼分離,因爲建造者隱藏了該產品是如何組裝的,因此須要改變一個產品的內部表示,只須要再定義一個具體的建造者便可。對象
建造者模式是在當建立複雜對象的算法應該獨立於該對象的組成部分以及它們的裝配方式時適用的模式。接口