深入解析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支持断点续传的多线程下载示例
Jan 16 Python
python 除法保留两位小数点的方法
Jul 16 Python
如何在Django中设置定时任务的方法示例
Jan 18 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
Jan 22 Python
一步步教你用python的scrapy编写一个爬虫
Apr 17 Python
详解用Python实现自动化监控远程服务器
May 18 Python
Python遍历字典方式就实例详解
Dec 28 Python
Python猴子补丁知识点总结
Jan 05 Python
Python random库使用方法及异常处理方案
Mar 02 Python
浅谈Python 函数式编程
Jun 20 Python
vscode+PyQt5安装详解步骤
Aug 12 Python
五种Python转义表示法
Nov 27 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
php 用checkbox一次性删除多条记录的方法
2010/02/23 PHP
国外PHP程序员的13个好习惯小结
2012/02/20 PHP
php全角字符转换为半角函数
2014/02/07 PHP
php生成4位数字验证码的实现代码
2015/11/23 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
实现超用户体验 table排序javascript实现代码
2009/06/22 Javascript
判断客户浏览器是否支持cookie的示例代码
2013/12/23 Javascript
用svg制作富有动态的tooltip
2015/07/17 Javascript
JavaScript编程的单例设计模讲解
2015/11/10 Javascript
BootStrap 图标icon符号图标glyphicons不正常显示的快速解决办法
2016/12/08 Javascript
Vue.js中用webpack合并打包多个组件并实现按需加载
2017/02/17 Javascript
jQuery插件jqGrid动态获取列和列字段的方法
2017/03/03 Javascript
jquery-file-upload 文件上传带进度条效果
2017/11/21 jQuery
nodejs高大上的部署方式(PM2)
2018/09/11 NodeJs
vue通过style或者class改变样式的实例代码
2018/10/30 Javascript
node app 打包工具pkg的具体使用
2019/01/17 Javascript
vueScroll实现移动端下拉刷新、上拉加载
2019/03/22 Javascript
vue router 跳转时打开新页面的示例方法
2019/07/28 Javascript
如何使用gpu.js改善JavaScript的性能
2020/12/01 Javascript
python使用百度翻译进行中翻英示例
2014/04/14 Python
Python中字符编码简介、方法及使用建议
2015/01/08 Python
Python获取DLL和EXE文件版本号的方法
2015/03/10 Python
Python和C/C++交互的几种方法总结
2017/05/11 Python
Python使用QRCode模块生成二维码实例详解
2017/06/14 Python
python数据类型判断type与isinstance的区别实例解析
2017/10/31 Python
python实现跨excel的工作表sheet之间的复制方法
2018/05/03 Python
python检测IP地址变化并触发事件
2018/12/26 Python
详解python中@的用法
2019/03/27 Python
python自动保存百度盘资源到百度盘中的实例代码
2019/08/26 Python
python调用接口的4种方式代码实例
2019/11/19 Python
解决Tensorflow占用GPU显存问题
2020/02/03 Python
TFRecord文件查看包含的所有Features代码
2020/02/17 Python
Python不支持 i ++ 语法的原因解析
2020/07/22 Python
写出二分查找算法的两种实现
2013/05/13 面试题
土地转让协议书范本
2014/04/15 职场文书
2016年“我们的节日·中秋节”活动总结
2016/04/05 职场文书