[Python设计模式] 第13章 造小人——建造者模式
2018-08-06 17:09
295 查看
github地址:https://github.com/cheesezh/python_design_patterns
题目1
用程序模拟一个画小人的过程,要求小人要有头,身子,左手,右手,左脚,右脚。
基础代码
class PersonDrawer(): def draw(self): print("画头") print("画身子") print("画左手") print("画右手") print("画左脚") print("画右脚") def main(): drawer = PersonDrawer() drawer.draw() main()
画头 画身子 画左手 画右手 画左脚 画右脚
题目2
再画一个身子胖一些的小人。
class FatPersonDrawer(): def draw(self): print("画头") print("画身子(胖一些)") print("画左手") print("画右手") print("画右脚") def main(): drawer = FatPersonDrawer() drawer.draw() main()
画头 画身子(胖一些) 画左手 画右手 画右脚
点评
画胖一些的小人时候,稍不注意,漏掉了左脚。画小人的步骤很繁琐,稍不注意就会漏掉一步,导致小人缺胳膊少腿。最好的办法就是规定,建造小人的时候,必须要有头,身子,左手,右手,左脚,右脚。这时候就可以使用建造这模式。
建造者模式
建造小人的
过程是稳定的,都需要头身手脚,但是具体建造的
细节是不同的,高矮胖瘦都有。
为了将一个复杂的对象的
构建与它的
表示分离,使得
同样的构建过程可以创建
不同的表示,就可以使用建造者模式,又叫“生成器模式”。
实现的方法就是定义抽象的建造者类,通过抽象函数的方法把构建的过程固定下来,这样就每一步也不能少,不会出现缺胳膊少腿的情况了。
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()
画头——瘦小人 画身子——瘦小人 画左手——瘦小人 画右手——瘦小人 画左腿——瘦小人 画头——胖小人 画身子——胖小人 画左手——胖小人 画右手——胖小人 画左腿——胖小人
点评
建造者模式的好处就是使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以需要改变一个产品的内部表示,只需要再定义一个具体的建造者即可。
建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。
相关文章推荐
- 设计模式之python版(九)--建造者模式
- python设计模式之建造者
- 深入解析Python设计模式编程中建造者模式的使用
- 设计模式之十三 建造者模式(建造小人)
- 设计模式六(建造者模式,采用python实现)
- Python设计模式——建造者模式
- 设计模式-建造者模式-builder-python
- Python设计模式(7)-建造者模式
- 深入解析Python设计模式编程中建造者模式的使用
- Python设计模式——建造者模式
- Python设计模式-建造者模式
- Python的创建型设计模式之建造者模式
- python设计模式(二):建造者模式
- Python设计模式--建造者模式
- 用造小人让你彻底搞懂什么是建造者设计模式
- python设计模式(建造者模式)
- 设计模式:抽象工厂模式(Python)
- [Python设计模式] 第26章 千人千面,内在共享——享元模式
- (设计模式四)java设计模式之建造者模式
- 23种设计模式(4):建造者模式