深入解析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获得linux下所有挂载点(mount points)的方法
Apr 29 Python
Python批量按比例缩小图片脚本分享
May 21 Python
python从入门到精通(DAY 1)
Dec 20 Python
关于Python如何避免循环导入问题详解
Sep 14 Python
PyQt5打开文件对话框QFileDialog实例代码
Feb 07 Python
python 不同方式读取文件速度不同的实例
Nov 09 Python
python生成特定分布数的实例
Dec 05 Python
Tensorflow进行多维矩阵的拆分与拼接实例
Feb 07 Python
在Python中用GDAL实现矢量对栅格的切割实例
Mar 11 Python
Python进程的通信Queue、Pipe实例分析
Mar 30 Python
python绘制高斯曲线
Feb 19 Python
Python实现归一化算法详情
Mar 18 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
从C/C++迁移到PHP——判断字符类型的函数
2006/10/09 PHP
php mssql 日期出现中文字符的解决方法
2009/03/10 PHP
php mb_substr()函数截取中文字符串应用示例
2014/07/29 PHP
php上传图片生成缩略图(GD库)
2016/01/06 PHP
php封装的单文件(图片)上传类完整实例
2016/10/18 PHP
前端开发部分总结[兼容性、DOM操作、跨域等](持续更新)
2010/03/04 Javascript
Jquery带搜索框的下拉菜单
2013/05/06 Javascript
Jquery 表单验证类介绍与实例
2013/06/09 Javascript
jquery-tips悬浮提示插件分享
2015/07/31 Javascript
jQuery基于ajax()使用serialize()提交form数据的方法
2015/12/08 Javascript
jquery插件autocomplete用法示例
2016/07/01 Javascript
自己封装的一个原生JS拖动方法(推荐)
2016/11/22 Javascript
jquery实现文本框的禁用和启用
2016/12/07 Javascript
AngularJS 文件上传控件 ng-file-upload详解
2017/01/13 Javascript
JS实现touch 点击滑动轮播实例代码
2017/01/19 Javascript
js es6系列教程 - 基于new.target属性与es5改造es6的类语法
2017/09/02 Javascript
vue引入js数字小键盘的实现代码
2018/05/14 Javascript
python常规方法实现数组的全排列
2015/03/17 Python
简单谈谈Python中的几种常见的数据类型
2017/02/10 Python
Python3简单实例计算同花的概率代码
2017/12/06 Python
Python实现使用卷积提取图片轮廓功能示例
2018/05/12 Python
编写多线程Python服务器 最适合基础
2018/09/14 Python
Python3简单爬虫抓取网页图片代码实例
2019/08/26 Python
python函数局部变量、全局变量、递归知识点总结
2019/11/15 Python
Python如何使用Gitlab API实现批量的合并分支
2019/11/27 Python
P D PAOLA意大利官网:西班牙著名的珠宝首饰品牌
2019/09/24 全球购物
HttpServlet类中的主要方法都有哪些?各自的作用是什么?
2014/03/16 面试题
餐饮业会计岗位职责
2013/12/19 职场文书
财务管理职业生涯规划书
2014/02/26 职场文书
教师岗位聘任书范文
2014/03/29 职场文书
社区灵活就业证明
2014/11/03 职场文书
企业财务经理岗位职责
2015/04/08 职场文书
2015年音乐教学工作总结
2015/07/22 职场文书
Python3 多线程(连接池)操作MySQL插入数据
2021/06/09 Python
Python中seaborn库之countplot的数据可视化使用
2021/06/11 Python
Java实现二维数组和稀疏数组之间的转换
2021/06/27 Java/Android