深入解析Python设计模式编程中建造者模式的使用


Posted in Python onMarch 02, 2016

建造者模式:将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。

基本思想
某类产品的构建由很多复杂组件组成;
这些组件中的某些细节不同,构建出的产品表象会略有不同;
通过一个指挥者按照产品的创建步骤来一步步执行产品的创建;
当需要创建不同的产品时,只需要派生一个具体的建造者,重写相应的组件构建方法即可。

代码结构

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()

没错,上面就是典型的模板方法模式的实现套路,回顾一下模板方法模式的定义: > 模板方法模式:定义一个工作流或算法的基本骨架,而将一些特定步骤的实现延迟到子类中。

模板方法模式更多的关注于算法流程,而建造者模式更多的关注于复杂对象的创建,模板模式应用场景比建造者模式更多一些,写起来也更自然一些。

类图

深入解析Python设计模式编程中建造者模式的使用

实例

#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 相关文章推荐
python下MySQLdb用法实例分析
Jun 08 Python
python基础教程之分支、循环简单用法
Jun 16 Python
Python基于回溯法解决01背包问题实例
Dec 06 Python
Python实现定时备份mysql数据库并把备份数据库邮件发送
Mar 08 Python
windows下python 3.6.4安装配置图文教程
Aug 21 Python
Python饼状图的绘制实例
Jan 15 Python
python安装numpy和pandas的方法步骤
May 27 Python
Python程序包的构建和发布过程示例详解
Jun 09 Python
python交易记录链的实现过程详解
Jul 03 Python
numpy.ndarray 实现对特定行或列取值
Dec 05 Python
在Python中利用pickle保存变量的实例
Dec 30 Python
matplotlib.pyplot.matshow 矩阵可视化实例
Jun 16 Python
举例讲解Python设计模式编程中对抽象工厂模式的运用
Mar 02 #Python
实例讲解Python设计模式编程之工厂方法模式的使用
Mar 02 #Python
详解设计模式中的工厂方法模式在Python程序中的运用
Mar 02 #Python
探究python中open函数的使用
Mar 01 #Python
Saltstack快速入门简单汇总
Mar 01 #Python
通过Python使用saltstack生成服务器资产清单
Mar 01 #Python
Python解析json文件相关知识学习
Mar 01 #Python
You might like
PHP5中的this,self和parent关键字详解教程
2007/03/19 PHP
php 归并排序 数组交集
2011/05/10 PHP
基于php实现长连接的方法与注意事项的问题
2013/05/10 PHP
php 备份数据库代码(生成word,excel,json,xml,sql)
2013/06/23 PHP
linux使用crontab实现PHP执行计划定时任务
2014/05/10 PHP
如何使用jQuery+PHP+MySQL来实现一个在线测试项目
2015/04/26 PHP
php中动态变量用法实例
2015/06/10 PHP
php array_reverse 以相反的顺序返回数组实例代码
2017/04/11 PHP
thinkphp框架page类与bootstrap分页(美化)
2017/06/25 PHP
php 提交表单 关闭layer弹窗iframe的实例讲解
2018/08/20 PHP
Jquery uploadify图片上传插件无法上传的解决方法
2013/12/16 Javascript
JavaScript实现网页截图功能
2014/10/16 Javascript
详解webpack与SPA实践之开发环境搭建
2017/12/18 Javascript
JavaScript 有用的代码片段和 trick
2018/02/22 Javascript
vuejs项目打包之后的首屏加载优化及打包之后出现的问题
2018/04/01 Javascript
Vue.js图片预览插件使用详解
2018/08/27 Javascript
layui实现form表单同时提交数据和文件的代码
2019/10/25 Javascript
JS实现压缩上传图片base64长度功能
2019/12/03 Javascript
Vue实现简易计算器
2020/02/25 Javascript
使用python编写android截屏脚本双击运行即可
2014/07/21 Python
在Python的setuptools框架下生成egg的教程
2015/04/13 Python
Python+PIL实现支付宝AR红包
2018/02/09 Python
pygame游戏之旅 添加碰撞效果的方法
2018/11/20 Python
python实现微信机器人: 登录微信、消息接收、自动回复功能
2019/04/29 Python
Python sorted排序方法如何实现
2020/03/31 Python
jupyter note 实现将数据保存为word
2020/04/14 Python
python继承threading.Thread实现有返回值的子类实例
2020/05/02 Python
python实现斗地主分牌洗牌
2020/06/22 Python
Python爬虫制作翻译程序的示例代码
2021/02/22 Python
枚举与#define宏的区别
2014/04/30 面试题
函授自我鉴定范文
2014/02/06 职场文书
小学教师自我鉴定范文
2014/03/20 职场文书
低碳环保倡议书
2014/04/14 职场文书
公安交警个人对照检查材料思想汇报
2014/10/01 职场文书
2015年中秋节演讲稿
2015/03/20 职场文书
车间安全生产管理制度
2015/08/06 职场文书