深入解析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 制作图片转pdf工具
Jan 30 Python
python创建列表并给列表赋初始值的方法
Jul 28 Python
tensorflow TFRecords文件的生成和读取的方法
Feb 06 Python
Python实现常见的回文字符串算法
Nov 14 Python
python3+opencv3识别图片中的物体并截取的方法
Dec 05 Python
Python实现平行坐标图的绘制(plotly)方式
Nov 22 Python
Python如何使用turtle库绘制图形
Feb 26 Python
python使用pymongo与MongoDB基本交互操作示例
Apr 09 Python
python空元组在all中返回结果详解
Dec 15 Python
如何在vscode中安装python库的方法步骤
Jan 06 Python
selenium+超级鹰实现模拟登录12306
Jan 24 Python
Python开发工具Pycharm的安装以及使用步骤总结
Jun 24 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中opendir函数用法实例
2014/11/15 PHP
PHP中array_slice函数用法实例详解
2014/11/25 PHP
PHP常用的排序和查找算法
2015/08/06 PHP
JQuery Ajax 跨域访问的解决方案
2010/03/12 Javascript
javascrip关于继承的小例子
2013/05/10 Javascript
屏蔽IE弹出"您查看的网页正在试图关闭窗口,是否关闭此窗口"的方法
2013/12/31 Javascript
浅析C/C++,Java,PHP,JavaScript,Json数组、对象赋值时最后一个元素后面是否可以带逗号
2016/03/22 Javascript
javascript实现简易计算器的代码
2016/05/31 Javascript
AngularJS 依赖注入详解及示例代码
2016/08/17 Javascript
JavaScript中数据类型转换总结
2016/12/25 Javascript
基于react组件之间的参数传递(详解)
2017/09/05 Javascript
nodejs使用http模块发送get与post请求的方法示例
2018/01/08 NodeJs
基于Vue渲染与插件的加载顺序的问题详解
2018/03/05 Javascript
微信小程序上线发布流程图文详解
2019/05/06 Javascript
微信小程序 调用远程接口 给全局数组赋值代码实例
2019/08/13 Javascript
小程序实现录音上传功能
2019/11/22 Javascript
angular组件间通讯的实现方法示例
2020/05/07 Javascript
一文秒懂nodejs中的异步编程
2021/01/28 NodeJs
python统计cpu利用率的方法
2015/06/02 Python
python字符串对其居中显示的方法
2015/07/11 Python
kafka-python批量发送数据的实例
2018/12/27 Python
python3中pip3安装出错,找不到SSL的解决方式
2019/12/12 Python
Pytest参数化parametrize使用代码实例
2020/02/22 Python
python excel多行合并的方法
2020/12/09 Python
python中使用np.delete()的实例方法
2021/02/01 Python
会计电算化专业毕业生推荐信
2013/12/24 职场文书
服装设计专业自荐书范文
2013/12/30 职场文书
查环查孕证明
2014/01/10 职场文书
面临毕业的毕业生自荐书范文
2014/02/05 职场文书
工程质量月活动方案
2014/02/19 职场文书
《小动物过冬》教学反思
2014/04/17 职场文书
小学爱国卫生月活动总结
2014/06/30 职场文书
关于读书的演讲稿500字
2014/08/27 职场文书
2014幼儿园教师师德师风演讲稿
2014/09/10 职场文书
党员评议个人总结
2014/10/20 职场文书
毕业论文答辩开场白
2015/05/27 职场文书