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
0
投稿
猜你喜欢
- 首先需要安装chardet库,有很多方式,我才用的是比较笨的方式:sudo pip install chardet#!/usr/bin/en
- 使用python爬虫库requests,urllib爬取今日头条街拍美图代码均有注释import re,json,requests,osfr
- python编程中,我们在修改代码,遇到空格很多的情况下,我们要删除空格。本文小编整理了三种字符串去除空格的方法:方法一:使用字符串函数re
- (1) 单人脸情况import cv2import dlibpath = "1.jpg"img = cv2.imread
- 如下所示:#ltp_data 字符串 写进777.txt1、def save(filename, contents): fh = open(
- 在自动化中, Selenium 自动化测试中有一个名字经常被提及 PageObject( 思想与面向对象的特征相 同 ) ,通常 PO 模型
- ScrapyScrapy是一个比较好用的Python爬虫框架,你只需要编写几个组件就可以实现网页数据的爬取。但是当我们要爬取的页面非常多的时
- 注:以下文章原文来自于Dr Charles Severance 的 《Python for Informatics》11.3 组合查询和抽取
- 说起来惭愧,总是犯一些小错误,纠结半天,这不应为一个分号的玩意折腾了好半天! 错误时在执行SQL语句的时候发出的,信息如下: Java代码
- 用程序来求积分的方法有很多,这篇文章主要是有关牛顿-科特斯公式。学过插值算法的同学最容易想到的就是用插值函数代替被积分函数来求积分,但实际上
- 网上大部分的免费asp程序使用的是access数据库。但是access数据库作为一个中小型的单机数据库系统,在承担访问量、数据量大的网站应用
- ASP开发网页牢记注意事项 选择自 RAINMAN_NET&
- 对于程序开发新手来说,一个最常见的困惑是测试的主题。他们隐约觉得“单元测试”是很好的,而且他们也应该做单元测试。但他们却不懂这个词的真正含义
- 本文实例讲述了微信小程序实现图片上传、删除和预览功能的方法。分享给大家供大家参考,具体如下:这里主要介绍一下微信小程序的图片上传图片删除和图
- 最近背着老婆买了一个switch卡带,这货居然给丈母娘讲,害得我被丈母娘说还小了,不买奶粉买游戏,太气人了,我连夜用python写了个《记仇
- 一、说在前面 需求:有一张长为960,宽为96的图片,需要将其分割成10张96*96的图
- # -*-coding:utf8 -*- ''' Python常见文件操作示例 os.path 模块中的路径名访问函
- 本文实例讲述了Python实现的大数据分析操作系统日志功能。分享给大家供大家参考,具体如下:一 代码1、大文件切分import osimpo
- 引子之前clubot使用的pyxmpp2的默认mainloop也就是一个poll的主循环,但是clubot上线后资源占用非常厉害,使用str
- 这篇文章主要介绍了Python partial函数原理及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值