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))
到此这篇关于Python 设计模式中的创建型建造者模式的文章就介绍到这了,更多相关Python建造者模式内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
赞 (0)