深入解析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实现获取网站PR及百度权重
Jan 21 Python
详解Python命令行解析工具Argparse
Apr 20 Python
Python3安装Pymongo详细步骤
May 26 Python
python文件拆分与重组实例
Dec 10 Python
Python字符串的常见操作实例小结
Apr 08 Python
python中正则表达式与模式匹配
May 07 Python
Python+AutoIt实现界面工具开发过程详解
Aug 07 Python
关于ZeroMQ 三种模式python3实现方式
Dec 23 Python
Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解
Mar 30 Python
Python with语句用法原理详解
Jul 03 Python
python 生成器需注意的小问题
Sep 29 Python
python与idea的集成的实现
Nov 20 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
DOTA2 无惧惊涛骇浪 昆卡大型水友攻略
2020/04/20 DOTA
ThinkPHP实现递归无级分类――代码少
2015/07/29 PHP
实例说明js脚本语言和php脚本语言的区别
2019/04/04 PHP
php版本CKEditor 4和CKFinder安装及配置方法图文教程
2019/06/05 PHP
《JavaScript高级程序设计》阅读笔记(二) ECMAScript中的原始类型
2012/02/27 Javascript
jquery获取子节点和父节点的示例代码
2013/09/10 Javascript
js的延迟执行问题分析
2014/06/23 Javascript
jQuery处理图片加载失败的常用方法
2015/06/08 Javascript
Javascript控制div属性动态变化实例分析
2015/10/08 Javascript
JavaScript多并发问题如何处理
2015/10/28 Javascript
Document.body.scrollTop的值总为零的快速解决办法
2016/06/09 Javascript
Vue计算属性的使用
2017/08/04 Javascript
使用socket.io实现简单聊天室案例
2018/01/02 Javascript
AjaxUpLoad.js实现文件上传功能
2018/03/02 Javascript
jQuery+datatables插件实现ajax加载数据与增删改查功能示例
2018/04/17 jQuery
详细分析Node.js 模块系统
2020/06/28 Javascript
微信小程序实现点赞业务
2021/02/10 Javascript
python 中文字符串的处理实现代码
2009/10/25 Python
python异步存储数据详解
2019/03/19 Python
Python3安装Pillow与PIL的方法
2019/04/03 Python
python3.6根据m3u8下载mp4视频
2019/06/17 Python
Python 将 QQ 好友头像生成祝福语的实现代码
2020/05/03 Python
Python如何实现大型数组运算(使用NumPy)
2020/07/24 Python
Python使用grequests并发发送请求的示例
2020/11/05 Python
使用Python webdriver图书馆抢座自动预约的正确方法
2021/03/04 Python
HTML5中通过li-canvas轻松实现单图、多图、圆角图绘制,单行文字、多行文字等
2018/11/30 HTML / CSS
html5 input输入实时检测以及延时优化
2018/07/18 HTML / CSS
AT&T Wireless:手机、无限数据计划和配件
2018/06/03 全球购物
优秀中专生推荐信
2013/11/17 职场文书
北京大学自荐信范文
2014/01/28 职场文书
合同意向书范本
2014/07/30 职场文书
2014年会计人员工作总结
2014/12/10 职场文书
2016大学生社会实践单位评语
2015/12/01 职场文书
2016国培学习心得体会
2016/01/08 职场文书
CSS3通过var()和calc()函数实现动画特效
2021/03/30 HTML / CSS
详解Java线程池是如何重复利用空闲线程的
2021/06/26 Java/Android