深入解析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代码来实现服务器和代理服务器
Jun 23 Python
python实现Floyd算法
Jan 03 Python
Python socket实现简单聊天室
Apr 01 Python
对Python中gensim库word2vec的使用详解
May 08 Python
python如何爬取个性签名
Jun 19 Python
详解python中的json和字典dict
Jun 22 Python
使用python判断你是青少年还是老年人
Nov 29 Python
Python同步遍历多个列表的示例
Feb 19 Python
Python3.7+tkinter实现查询界面功能
Dec 24 Python
Python + selenium + crontab实现每日定时自动打卡功能
Mar 31 Python
Python爬虫实例——scrapy框架爬取拉勾网招聘信息
Jul 14 Python
详解Python 最短匹配模式
Jul 29 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 各种排序算法实现代码
2009/08/20 PHP
php+jquery编码方面的一些心得(utf-8 gb2312)
2010/10/12 PHP
让PHP显示Facebook的粉丝数量方法
2014/01/08 PHP
PHP中使用FFMPEG获取视频缩略图和视频总时长实例
2014/05/04 PHP
php自定义函数截取汉字长度
2014/05/15 PHP
ThinkPHP实例化模型的四种方法概述
2014/08/22 PHP
php 类自动载入的方法
2015/06/03 PHP
PHP连接Nginx服务器并解析Nginx日志的方法
2015/08/16 PHP
php array 转json及java 转换 json数据格式操作示例
2019/11/13 PHP
javascript网页关闭时提醒效果脚本
2008/10/22 Javascript
JS画5角星方法介绍
2013/09/17 Javascript
jQuery中parent()方法用法实例
2015/01/07 Javascript
JavaScript实现向右伸出的多级网页菜单效果
2015/08/25 Javascript
javascript检查某个元素在数组中的索引值
2016/03/30 Javascript
第三篇Bootstrap网格基础
2016/06/21 Javascript
AngularJs Managing Service Dependencies详解
2016/09/02 Javascript
Vue.js + Nuxt.js 项目中使用 Vee-validate 表单校验
2019/04/22 Javascript
JS+css3实现幻灯片轮播图
2020/08/14 Javascript
Python序列之list和tuple常用方法以及注意事项
2015/01/09 Python
用Python实现随机森林算法的示例
2017/08/24 Python
Python实现字符串匹配算法代码示例
2017/12/05 Python
python如何修改装饰器中参数
2018/03/20 Python
matplotlib.pyplot绘图显示控制方法
2019/01/15 Python
说说如何遍历Python列表的方法示例
2019/02/11 Python
python3获取url文件大小示例代码
2019/09/18 Python
python实现大战外星人小游戏实例代码
2019/12/26 Python
python3跳出一个循环的实例操作
2020/08/18 Python
css3实现文字扫光渐变动画效果的示例
2017/11/07 HTML / CSS
GLAMGLOW香港官网:明星出镜前的秘密武器
2017/03/16 全球购物
农业大学毕业生的个人自我评价
2013/10/11 职场文书
应届毕业生的自我鉴定
2013/11/13 职场文书
婚前协议书范本
2014/04/15 职场文书
机关作风建设自查报告及整改措施
2014/10/21 职场文书
学校实习推荐信
2015/03/27 职场文书
学校光盘行动倡议书
2015/04/28 职场文书
Java8 Stream API 提供了一种高效且易于使用的处理数据的方式
2022/04/13 Java/Android