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()
画头——瘦小人 画身子——瘦小人 画左手——瘦小人 画右手——瘦小人 画左腿——瘦小人 画头——胖小人 画身子——胖小人 画左手——胖小人 画右手——胖小人 画左腿——胖小人
建造者模式的好处就是使得建造代码与表示代码分离,因为建造者隐藏了该产品是如何组装的,因此须要改变一个产品的内部表示,只须要再定义一个具体的建造者便可。对象
建造者模式是在当建立复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。接口