深入解析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中的len()函数的使用
Apr 07 Python
用Python写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动
Nov 05 Python
python 将字符串转换成字典dict的各种方式总结
Mar 23 Python
使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
Mar 23 Python
python广度优先搜索得到两点间最短路径
Jan 17 Python
关于不懂Chromedriver如何配置环境变量问题解决方法
Jun 12 Python
解决Django中调用keras的模型出现的问题
Aug 07 Python
Python TKinter如何自动关闭主窗口
Feb 26 Python
Python开发企业微信机器人每天定时发消息实例
Mar 17 Python
Python3实现个位数字和十位数字对调, 其乘积不变
May 03 Python
Pandas实现一列数据分隔为两列
May 18 Python
windows系统Tensorflow2.x简单安装记录(图文)
Jan 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
初识PHP中的Swoole
2016/04/05 PHP
PHP socket 模拟POST 请求实例代码
2016/07/18 PHP
js 页面执行时间计算代码
2009/03/04 Javascript
jquery.validate使用攻略 第五步 正则验证
2010/07/01 Javascript
jQuery之排序组件的深入解析
2013/06/19 Javascript
解析Javascript中难以理解的11个问题
2013/12/09 Javascript
排序算法的javascript实现与讲解(99js手记)
2014/09/28 Javascript
Javascript设计模式之观察者模式的多个实现版本实例
2015/03/03 Javascript
jQuery基于扩展实现的倒计时效果
2016/05/14 Javascript
JS封装的选项卡TAB切换效果示例
2016/09/20 Javascript
Vue数据驱动模拟实现1
2017/01/11 Javascript
基于daterangepicker日历插件使用参数注意的问题
2017/08/10 Javascript
详解如何实现一个简单的Node.js脚手架
2017/12/04 Javascript
vue 开发之路由配置方法详解
2019/12/02 Javascript
基于better-scroll 实现歌词联动功能的代码
2020/05/07 Javascript
Element实现表格嵌套、多个表格共用一个表头的方法
2020/05/09 Javascript
python二分法实现实例
2013/11/21 Python
python append、extend与insert的区别
2016/10/13 Python
python3下实现搜狗AI API的代码示例
2018/04/10 Python
使用Django清空数据库并重新生成
2020/04/03 Python
Python的控制结构之For、While、If循环问题
2020/06/30 Python
Python数据可视化实现多种图例代码详解
2020/07/14 Python
详解通过focusout事件解决IOS键盘收起时界面不归位的问题
2019/07/18 HTML / CSS
大学生个人简历自我评价
2013/11/16 职场文书
学生干部的自我评价分享
2014/01/18 职场文书
一夜的工作教学反思
2014/02/08 职场文书
优秀护士先进事迹
2014/05/08 职场文书
关于运动会广播稿200字
2014/10/08 职场文书
公安纪律作风整顿剖析材料
2014/10/10 职场文书
2014年大堂经理工作总结
2014/11/21 职场文书
文明单位汇报材料
2014/12/24 职场文书
餐馆开业致辞
2015/08/01 职场文书
入党申请书怎么写?
2019/06/21 职场文书
SpringBoot2 参数管理实践之入参出参与校验的方式
2021/06/16 Java/Android
vue实现拖拽交换位置
2022/04/07 Vue.js
Python实现聚类K-means算法详解
2022/07/15 Python