深入解析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中PIL安装简单教程
Apr 21 Python
机器学习python实战之手写数字识别
Nov 01 Python
Python Pandas找到缺失值的位置方法
Apr 12 Python
python3模拟实现xshell远程执行liunx命令的方法
Jul 12 Python
python实现的生成word文档功能示例
Aug 23 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
Sep 03 Python
Python中的引用和拷贝实例解析
Nov 14 Python
Pytorch实现各种2d卷积示例
Dec 30 Python
tensorflow求导和梯度计算实例
Jan 23 Python
Python dict和defaultdict使用实例解析
Mar 12 Python
python 爬取腾讯视频评论的实现步骤
Feb 18 Python
使用Python拟合函数曲线
Apr 14 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判断字符串在另一个字符串位置的方法
2014/02/27 PHP
JQuery AJAX实现目录浏览与编辑的代码
2008/10/21 Javascript
谷歌浏览器 insertCell与appendChild的区别
2009/02/12 Javascript
javaScript 数值型和字符串型之间的转换
2009/07/25 Javascript
JQuery 获取和设置Select选项的代码
2010/02/07 Javascript
json原理分析及实例介绍
2012/11/29 Javascript
js中parseInt函数浅谈
2013/07/31 Javascript
jquery ajax的success回调函数中实现按钮置灰倒计时
2013/11/19 Javascript
javascript如何动态加载表格与动态添加表格行
2013/11/27 Javascript
js判断url是否有效的两种方法
2014/03/04 Javascript
一个JavaScript获取元素当前高度的实例
2014/10/29 Javascript
jquery获取checkbox的值并post提交
2015/01/14 Javascript
详解Javascript中的Object对象
2016/02/28 Javascript
JQuery控制图片由中心点逐渐放大效果
2016/06/26 Javascript
AngularJS ng-template寄宿方式用法分析
2016/11/07 Javascript
jQuery插件MovingBoxes实现左右滑动中间放大图片效果
2017/02/28 Javascript
JS实现基于Sketch.js模拟成群游动的蝌蚪运动动画效果【附demo源码下载】
2017/08/18 Javascript
基于jquery.page.js实现分页效果
2018/01/01 jQuery
微信小程序日期选择器实例代码
2018/07/18 Javascript
vue-router的使用方法及含参数的配置方法
2018/11/13 Javascript
个人小程序接入支付解决方案
2019/05/23 Javascript
Vue快速实现通用表单验证功能
2019/12/05 Javascript
Django Rest framework之权限的实现示例
2018/12/17 Python
python3实现mysql导出excel的方法
2019/07/31 Python
深入浅析python 中的self和cls的区别
2020/06/20 Python
解决Keras TensorFlow 混编中 trainable=False设置无效问题
2020/06/28 Python
python定义类的简单用法
2020/07/24 Python
如何使用amaze ui的分页样式封装一个通用的JS分页控件
2020/08/21 HTML / CSS
英国最大的宠物食品和宠物用品网上零售商: Zooplus
2016/08/01 全球购物
英国123鲜花网站:123 Flowers
2019/07/07 全球购物
什么是表空间(tablespace)和系统表空间(System tablespace)
2013/02/25 面试题
快餐店的创业计划书范文
2014/01/29 职场文书
美容院经理岗位职责
2014/04/03 职场文书
诚信考试主题班会
2015/08/17 职场文书
如何用vue实现网页截图你知道吗
2021/11/17 Vue.js
Android开发手册自定义Switch开关按钮控件
2022/06/10 Java/Android