题目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设计模式] 第13章 造小人——建造者模式相关推荐

  1. 全景丨0基础学习VR全景制作,平台篇第13章:热点功能-总览介绍

    全景丨0基础学习VR全景制作,平台篇第13章:热点功能-总览介绍 大家好,欢迎观看蛙色VR官方--后台使用系列课程! 一.热点功能概览 热点,指在全景作品中添加各种类型图标的按钮,引导用户通过按钮产生 ...

  2. 设计模式C++实现(6)——建造者模式

    软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装.继承.多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累.最 ...

  3. 设计模式C++实现(3)——建造者模式

    软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装.继承.多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累.最 ...

  4. 使用设计模式出任CEO迎娶白富美(7)–建造者模式解决工艺复杂问题

    本文目录 1. 对工艺流程的思考 2. 对建造者模式的参考 3. 理论联系实践 1. 对工艺流程的思考 工艺有很多种,不同产品工艺流程不同,不同的工艺流程有不同的操作顺序. 以目前车间生产的主流产品物 ...

  5. 设计模式之美(4)-创建型-建造者模式

    Builder模式,中文翻译为建造者模式或者构建者模式,也有人叫它生成器模式. 建造者模式原理和代码非常简单, 难点在于应用场景.比如直接使用构造函数或者配合set方法就能创建对象,为什么还需要建造者 ...

  6. 设计模式详解(四)--------建造者模式

    一.定义 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式. 二.使用范围 1.创建一个复杂的对象,他有多个不同的模块组成,其中有些模块不会改变, ...

  7. [Python设计模式] 第1章 计算器——简单工厂模式

    github地址:https://github.com/cheesezh/python_design_patterns 写在前面的话 """ 读书的时候上过<设计模 ...

  8. 设计模式总结之Builder Pattern(建造者模式)

    Builder Pattern(建造者模式) 意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 适用性 * 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配 ...

  9. JAVA设计模式是个什么玩意儿_04_建造者模式

    1. 说明 (1)英文名叫Builder,建造者模式,也叫生成器模式. (2)属于创建型模式. 2. 定义 要想实现同样的构建过程有不同的表现,自然的思路就是把构建过程独立出来,在生成器模式中把它称为 ...

最新文章

  1. AAAI 2020| 一文看尽腾讯优图10篇入选论文
  2. Cookie与 Session使用详解
  3. C++模板的特例化编译为多重定义问题
  4. Linux之Redis安装
  5. Maven警告:“java使用了未经检查或不安全的操作。java: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。“
  6. 因为一次宕机,终于搞透了 Kafka 高可用原理!
  7. python的migratetodb_Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
  8. mysql 表名通配符导出,mysqldump只有某些前缀/ Mysqldump通配符的表?
  9. NGRAIN在模型轻量化上的应用
  10. python referer伪造_php伪造Referer请求反盗链资源
  11. 毕业设计《项目管理》总结06之ajax的初步使用经验
  12. 服务器配置ssh 登录,取消账号密码登录
  13. Stata15重编码
  14. Lua AES加解密
  15. Java Web学习(1):Web应用程序与Web服务器
  16. 技校学高铁还是计算机,华蓥高铁动车司学那个专业好,高铁职业技术学校面试...
  17. Spark的位置优先: TaskSetManager 的有效 Locality Levels
  18. html留言板原理,js实现留言板
  19. 越来越多动物正在灭绝,“AI+动物”能否改变这一局面?
  20. 3500x架构_R5 3500X怎么样

热门文章

  1. 无图无真相!设计模式概览
  2. DIY大神评测:联想拯救者r7000p配置参数评测-联想拯救者R7000和R7000P区别哪个好
  3. 数据权限实现方案遐想
  4. 服务器右键磁盘分区 修复,手把手解答win10系统使用自带磁盘分区的修复办法
  5. 区间和问题——离散化
  6. Data efficient parameter efficient tuning 助教 姜成翰
  7. fotf matlab,分数阶matlab工具箱
  8. java 模拟登录出现系统异常_很奇怪!Java web问题,模拟登陆教务系统刷新两次后就没反应了!...
  9. Java键盘输入一个数字, 输出其绝对值
  10. SQL判断一个事件段 是否在数据库中与其他时间段有重叠 判断时间重叠