深入解析Python设计模式编程中建造者模式的使用
作者:Blue Wish 时间:2021-03-10 15:32:18
建造者模式:将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。
基本思想
某类产品的构建由很多复杂组件组成;
这些组件中的某些细节不同,构建出的产品表象会略有不同;
通过一个指挥者按照产品的创建步骤来一步步执行产品的创建;
当需要创建不同的产品时,只需要派生一个具体的建造者,重写相应的组件构建方法即可。
代码结构
class Builder(object):
"""基类"""
def Part1(self):
# 不同类型的产品,该步骤的细节可能不同
raise NotImplementedError()
def Part2(self):
# 不同类型的产品,该步骤的细节可能不同
raise NotImplementedError()
class Builder1(Builder):
"""派生类,生产builder1类型的产品"""
def Part1(self):
print 'builder1 Part1'
def Part2(self):
print 'builder1 Part2'
class Builder2(Builder):
"""派生类,生产builder2类型的产品"""
def Part1(self):
print 'builder2 Part1'
def Part2(self):
print 'builder2 Part2'
class Director(object):
"""指挥者,负责组织产品的构建过程"""
def Build(self, builder):
builder.Part1()
builder.Part2()
def client():
director = Director()
director.Build(Builder1())
director.Build(Builder2())
这里有一个疑问,指挥者这个角色有什么用呢。感觉除了增加client的调用负担外,似乎没什么用处。为什么不把产品构建过程放在Builder基类中呢,像下面这样:
class Builder(object):
"""基类"""
def Part1(self):
raise NotImplementedError()
def Part2(self):
raise NotImplementedError()
def Build(self):
self.Part1()
self.Part2()
class Builder1(Builder):
def Part1(self):
print 'builder1 Part1'
def Part2(self):
print 'builder1 Part2'
class Builder2(Builder):
def Part1(self):
print 'builder2 Part1'
def Part2(self):
print 'builder2 Part2'
def client():
Builder1().Build()
Builder2().Build()
没错,上面就是典型的模板方法模式的实现套路,回顾一下模板方法模式的定义: > 模板方法模式:定义一个工作流或算法的基本骨架,而将一些特定步骤的实现延迟到子类中。
模板方法模式更多的关注于算法流程,而建造者模式更多的关注于复杂对象的创建,模板模式应用场景比建造者模式更多一些,写起来也更自然一些。
类图
实例
#encoding=utf-8
#
#by panda
#建造者模式
def printInfo(info):
print unicode(info, 'utf-8').encode('gbk')
#建造者基类
class PersonBuilder():
def BuildHead(self):
pass
def BuildBody(self):
pass
def BuildArm(self):
pass
def BuildLeg(self):
pass
#胖子
class PersonFatBuilder(PersonBuilder):
type = '胖子'
def BuildHead(self):
printInfo("构建%s的头" % self.type)
def BuildBody(self):
printInfo("构建%s的身体" % self.type)
def BuildArm(self):
printInfo("构建%s的手" % self.type)
def BuildLeg(self):
printInfo("构建%s的脚" % self.type)
#瘦子
class PersonThinBuilder(PersonBuilder):
type = '瘦子'
def BuildHead(self):
printInfo("构建%s的头" % self.type)
def BuildBody(self):
printInfo("构建%s的身体" % self.type)
def BuildArm(self):
printInfo("构建%s的手" % self.type)
def BuildLeg(self):
printInfo("构建%s的脚" % self.type)
#指挥者
class PersonDirector():
pb = None;
def __init__(self, pb):
self.pb = pb
def CreatePereson(self):
self.pb.BuildHead()
self.pb.BuildBody()
self.pb.BuildArm()
self.pb.BuildLeg()
def clientUI():
pb = PersonThinBuilder()
pd = PersonDirector(pb)
pd.CreatePereson()
pb = PersonFatBuilder()
pd = PersonDirector(pb)
pd.CreatePereson()
return
if __name__ == '__main__':
clientUI();
标签:Python,设计模式
0
投稿
猜你喜欢
如何安装控制器JavaScript生成插件详解
2024-04-10 10:51:51
php让json_encode不自动转义斜杠“/”的方法
2023-08-19 17:04:28
分享PyCharm最新激活码(真永久激活方法)不用每月找安装参数或最新激活码了
2022-05-04 15:35:38
常用的匹配正则表达式和实例
2008-06-07 09:19:00
pycharm 使用tab跳出正在编辑的括号(){}{}等问题
2023-06-14 03:17:55
python Django里CSRF 对应策略详解
2021-02-15 20:36:19
CSS清除浮动常用方法小结
2009-07-07 11:59:00
MySQL 表数据的导入导出操作示例
2024-01-18 17:20:19
Ubuntu系统安装与配置MySQL
2024-01-27 17:41:37
python基础之集合
2022-04-21 05:03:50
Python图像处理之使用OpenCV检测对象颜色
2023-05-20 01:00:18
MYSQL数据库使用UTF-8中文编码乱码的解决办法
2024-01-23 00:22:28
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
2022-01-14 07:38:10
jQuery+php简单实现全选删除的方法
2023-11-05 20:23:38
MySQL 常见错误分析与解决方法
2024-01-16 12:36:50
python检查目录文件权限并修改目录文件权限的操作
2022-06-26 04:13:31
浅谈PHP的数据库接口和技术
2024-05-02 17:13:49
Python读取配置文件-ConfigParser的二次封装方法
2023-06-15 09:19:58
解决vue项目input输入框双向绑定数据不实时生效问题
2024-05-28 15:42:13
python实现差分隐私Laplace机制详解
2022-01-08 16:37:41