欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

Python设计模式—创建型模式—建造者模式

时间:2023-05-29
目录 文章目录

目录建造者模式应用场景代码示例 建造者模式

建造者模式,顾名思义类似于建筑工人,他们按照有条理的施工顺序(e.g、打桩 => 浇筑框架 => 砌墙 => 装修)来进行建筑的修建。对于千差万别的建筑,都可以复用同样的施工流程。因为不同的材料、不同设计,可以有不同的表现。

建造者模式,与抽象工厂模式同样用于实例化复杂的对象,主要区别在于:

抽象工厂模式侧重于实例化多个系列的复杂对象。建造者模式侧重于一步步有序地构造一个复杂对象。 应用场景 代码示例

按照有序的步骤来组装(建造)一个复杂对象。

实体角色:

抽象建造者(Builder)具体建造者(Concrete Builder)指挥者(Director)产品(Product)

import abcclass 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 # 具体建造者 Doraemonclass 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 = "短腿" # 具体建造者 Gundamclass 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))

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。