深入解析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 相关文章推荐
使用tensorflow实现AlexNet
Nov 20 Python
Python读取Excel表格,并同时画折线图和柱状图的方法
Oct 14 Python
Python中文件的写入读取以及附加文字方法
Jan 23 Python
Python实现截取PDF文件中的几页代码实例
Mar 11 Python
详解用python写网络爬虫-爬取新浪微博评论
May 10 Python
python3.6生成器yield用法实例分析
Aug 23 Python
基于Python中isfile函数和isdir函数使用详解
Nov 29 Python
python plotly画柱状图代码实例
Dec 13 Python
pytorch之inception_v3的实现案例
Jan 06 Python
Python读取分割压缩TXT文本文件实例
Feb 14 Python
python如何运行js语句
Sep 09 Python
教你如何使用Python下载B站视频的详细教程
Apr 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中empty is_null和isset的测试
2013/06/29 PHP
PHP+MYSQL实现用户的增删改查
2015/03/24 PHP
WampServer搭建php环境时遇到的问题汇总
2015/07/23 PHP
PHP的关于变量和日期处理的一些面试题目整理
2015/08/10 PHP
php7基于递归实现删除空文件夹的方法示例
2017/06/15 PHP
浅谈php调用python文件
2019/03/29 PHP
Ajax::prototype 源码解读
2007/01/22 Javascript
Javascript 面向对象 继承
2010/05/13 Javascript
javascript的字符串按引用复制和传递,按值来比较介绍与应用
2012/12/28 Javascript
MultiSelect左右选择控件的设计与实现介绍
2013/06/08 Javascript
js检验密码强度(低中高)附图
2014/06/05 Javascript
jquery实现仿Flash的横向滑动菜单效果代码
2015/09/17 Javascript
BootStrap组件之进度条的基本用法
2017/01/19 Javascript
vue.js 使用v-if v-else发现没有执行解决办法
2017/05/15 Javascript
Vue-路由导航菜单栏的高亮设置方法
2018/03/17 Javascript
Bootbox将后台JSON数据填充Form表单的实例代码
2018/09/10 Javascript
使用Angular 6创建各种动画效果的方法
2018/10/10 Javascript
bootstrap下拉分页样式 带跳转页码
2018/12/29 Javascript
angular4+百分比进度显示插件用法示例
2019/05/05 Javascript
开发Node CLI构建微信小程序脚手架的示例
2020/03/27 Javascript
对Python 数组的切片操作详解
2018/07/02 Python
对django xadmin自定义菜单的实例详解
2019/01/03 Python
opencv与numpy的图像基本操作
2019/03/08 Python
python网络编程之多线程同时接受和发送
2019/09/03 Python
使用Python画出小人发射爱心的代码
2019/11/23 Python
python 字典套字典或列表的示例
2019/12/16 Python
python pillow库的基础使用教程
2021/01/13 Python
全球销量第一生发产品:Viviscal
2017/12/21 全球购物
设计师大码女装:11 Honoré
2020/05/03 全球购物
夜大自我鉴定
2013/10/31 职场文书
医学检验专业个人求职信范文
2013/12/04 职场文书
批评与自我批评发言稿
2014/10/15 职场文书
个人股份合作协议书
2014/10/24 职场文书
亚布力滑雪场导游词
2015/02/09 职场文书
JavaScript实现复选框全选功能
2021/04/11 Javascript
Python安装及建立虚拟环境的完整步骤
2022/06/25 Servers