D107设计模式_1建造者模式20221119
一、构建模式
构建模式属于对象的创建模式,可以把对象的内部属性和构建方法分离开来,可以构建自己需要的属性。
当有些对象比较复杂的时候,需要的属性比较灵活的就需要用到构建模式
二、构建者模式和抽象工厂模式的区别:
抽象工厂模式主要注重与创建一个产品,而不注重细节,
抽象工厂模式将对象的全部都封装到工厂类中,有工厂类提供最终的产品;而构建者模式也是创造一个产品,但是更加注重于细节的实现,
它一般只提供产品类的各个组件的建造,而将具体的建造过程交付给指导者,由指导者负责将各个组件按照特定的规则组建产品,然后将组建好的产品交付给客户端。
三、构建者模式的结构
1.Director(指导者) 主要功能是复制安排复杂对象的的建造顺序,与Builder之间存在关联关系,通过
construct()建造方法中调用Builder的部件构造和装配方法实现复杂对象的建造。
客户端一般至于指导者交互,在客户端确定Builder的类型,并实例化具体对象通过构造函数或者Setter()方法将对象传入指导者中。
2.Builder(抽象建造者)对复杂对象的创建过程加以抽象,给出一个抽象接口以规范对象的各个部分的建造,该接口或者抽象类一般声明两类方法:
一类是:buildXXX() 用以创建对象的各个部分,另一类是getXXX() 用以返回复杂的对象。
3.ConcreateBuilder(具体构建者)它实现了Builder的接口,针对不同的业务逻辑,实现了对复杂对象的各个部分的创建。
4.Product(产品角色)含有多个组件是被构建的复杂对象由ConcreateBuilder创建该产品的内部表示并定义
四、实现
import string import abc # 产品-product 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): # 接口类,制定规范,只要此类必须要设置以下的被abstractmethod装饰的这些方法。 @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 # 具体建造者1Doraemon 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 = "短腿" # 具体建造者2 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 = "带有推进器的机械腿" # 指挥者 director 确定建造顺序 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)) # 构建机器人1 gundam = Gundam() print(director.build(gundam)) # 构建机器人2
【输出结果】
第一步:安装身体
第二步:安装头
第三步:安装手臂
第四步:安装脚
我是一个机器人:('蓝色的狸猫头', '带有百宝袋的身体', '圆手', '短腿')
第一步:安装身体
第二步:安装头
第三步:安装手臂
第四步:安装脚
我是一个机器人:('白色的机械头', '钢铁般的身体', '带有巨炮的机械手', '带有推进器的机械腿')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用