Python 设计模式中的创建型建造者模式
作者:范桂飓 发布时间:2021-05-23 02:41:50
标签:Python,建造者,模式
一、建造者模式
建造者模式,顾名思义类似于建筑工人,他们按照有条理的施工顺序(e.g. 打桩 => 浇筑框架 => 砌墙 => 装修)来进行建筑的修建。对于千差万别的建筑,都可以复用同样的施工流程。因为不同的材料、不同设计,可以有不同的表现。
建造者模式,与抽象工厂模式同样用于实例化复杂的对象,主要区别在于:
抽象工厂模式侧重于实例化多个系列的复杂对象。
建造者模式侧重于一步步有序地构造一个复杂对象。
二、代码示例
按照有序的步骤来组装(建造)一个复杂对象。
实体角色:
抽象建造者(
Builder
)具体建造者(
Concrete Builder
)指挥者(
Director
)产品(
Product
)
import abc
class Robot:
def __init__(self, head=None, body=None, arms=None, legs=None):
self.head = head
self.body = body
self.arms = arms
self.legs = legs
def __str__(self):
return f"我是一个机器人:{self.head, self.body, self.arms, self.legs}"
# 抽象建造者
class RobotBuilder(metaclass=abc.ABCMeta):
@abc.abstractmethod
def build_head(self):
print("第二步:安装头")
pass
@abc.abstractmethod
def build_body(self):
print("第一步:安装身体")
pass
@abc.abstractmethod
def build_arms(self):
print("第三步:安装手臂")
pass
@abc.abstractmethod
def build_legs(self):
print("第四步:安装脚")
pass
# 具体建造者 Doraemon
class Doraemon(RobotBuilder):
def __init__(self):
self.robot = Robot()
def build_head(self):
super().build_head()
self.robot.head = "蓝色的狸猫头"
def build_body(self):
super().build_body()
self.robot.body = "带有百宝袋的身体"
def build_arms(self):
super().build_arms()
self.robot.arms = "圆手"
def build_legs(self):
super().build_legs()
self.robot.legs = "短腿"
# 具体建造者 Gundam
class Gundam(RobotBuilder):
def __init__(self):
self.robot = Robot()
def build_head(self):
super().build_head()
self.robot.head = "白色的机械头"
def build_body(self):
super().build_body()
self.robot.body = "钢铁般的身体"
def build_arms(self):
super().build_arms()
self.robot.arms = "带有巨炮的机械手"
def build_legs(self):
super().build_legs()
self.robot.legs = "带有推进器的机械腿"
# 指挥者,确定建造顺序
class BuildDirector:
def build(self, builder):
builder.build_body()
builder.build_head()
builder.build_arms()
builder.build_legs()
return builder.robot
if __name__ == "__main__":
director = BuildDirector()
doraemon = Doraemon()
print(director.build(doraemon))
gundam = Gundam()
print(director.build(gundam))
来源:https://is-cloud.blog.csdn.net/article/details/122922317


猜你喜欢
- 1、控制"纵打"、 横打”和“页面的边距。 (1)<script defer> function SetPr
- 概要 “SQL Server 桌面引擎”(也叫 MSDE 2000)没有自己的用户界面,因为它主要设计为在后台运行。用户通过 MSDE 20
- 远程连接SQL Server 2008,服务器端和客户端配置关键设置:第一步(SQL2005、SQL2008):开始-->程序--&g
- 本文实例讲述了php实现搜索一维数组元素并删除二维数组对应元素的方法。分享给大家供大家参考。具体如下:定义一个一维数组一个二维数组如下$fr
- chr(13) 是一个回车Chr(10) 是一个换行符chr
- 在开始部分,请看官非常非常耐心地阅读下面几个枯燥的术语解释,本来这不符合本教程的风格,但是,请看官谅解,因为列位将来一定要阅读枯燥的东西的。
- 本文实例为大家分享了python实现简单图片物体标注工具的具体代码,供大家参考,具体内容如下# coding: utf-8"&qu
- asp采集常用的几个FUCTION如:利用流保存文件,利用fso检测文件是否存在,利用fso检测文件夹是否存在,保存文件,取得远程数据等1.
- 1、表示乘号2、表示倍数,例如:def T(msg,time=1): print((msg+' ')*time)
- 目录jQuery的$.ajaxWebpack时代的开始深入了解Promise消灭嵌套await-to-js总结jQuery的$.ajax在开
- 1.安装好JDK下载并安装好jdk-12.0.1_windows-x64_bin.exe,配置环境变量:新建系统变量JAVA_HOME,值为
- 1、安装 nvmcurl -o- https://raw.githubusercontent.com/creationix/nvm/v0.3
- 如下所示:# 计算面积函数def area(width, height): return width * heightdef print_w
- Pycharm打开大文件的时候出现这个错误,根据提示以及百度知道,是因为IDEA对能关联的文件大小做了限制,主要是为了保护内存,默认值为25
- 描述Fashion Mnist 是一个类似于 Mnist 的图像数据集. 涵盖 10 种类别的 7 万 (6 万训练集 + 1 万测试集)
- 一、什么是索引 减少磁盘I/O和逻辑读次数的最佳方法之一就是使用【索引】 索引允许SQL Server在表中查找数据而不需要扫描整个表。 1
- 1、解决方法(1)忽视元组。缺少类别标签时,通常这样做(假设挖掘任务与分类有关),除非元组有多个属性缺失值,否则该方法不太有效。当个属性缺值
- python给数据加上高斯噪声一开始用MATLAB给数据加噪声很简单,就一句话:% 给数据加指定SNR的高斯噪声signal_noise =
- 浏览器的出现互联网的出现是人类信息交流方式的一次划时代的革命,在这场革命中有两个技术对互联网的发展起到了决定性的作用:一个技术带来的人类信息
- 这几天在做一个数据集,由于不是很熟悉Linux下的命令,所以特地用了强大的python来做。我之前有一个数据集但是我只要里面名称带有comp