建造者模式:将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。
基本思想
某类产品的构建由很多复杂组件组成;
这些组件中的某些细节不同,构建出的产品表象会略有不同;
通过一个指挥者按照产品的创建步骤来一步步执行产品的创建;
当需要创建不同的产品时,只需要派生一个具体的建造者,重写相应的组件构建方法即可。
代码结构
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()
没错,上面就是典型的模板方法模式的实现套路,回顾一下模板方法模式的定义: > 模板方法模式:定义一个工作流或算法的基本骨架,而将一些特定步骤的实现延迟到子类中。
模板方法模式更多的关注于算法流程,而建造者模式更多的关注于复杂对象的创建,模板模式应用场景比建造者模式更多一些,写起来也更自然一些。
类图
实例
#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();
本文向大家介绍深入解析Java的设计模式编程中单例模式的使用,包括了深入解析Java的设计模式编程中单例模式的使用的使用技巧和注意事项,需要的朋友参考一下 定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 类型:创建类模式 类图: 类图知识点: 1.类图分为三部分,依次是类名、属性、方法 2.以<<开头和以>>结尾的为注释信息 3.修饰符+代表public,-代表privat
本文向大家介绍深入解析C++设计模式编程中解释器模式的运用,包括了深入解析C++设计模式编程中解释器模式的运用的使用技巧和注意事项,需要的朋友参考一下 解释器模式(interpreter),给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 解释器模式需要解决的是,如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语
本文向大家介绍深入分析JAVA 建造者模式,包括了深入分析JAVA 建造者模式的使用技巧和注意事项,需要的朋友参考一下 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。 介绍 意图: 将一个复杂的
本文向大家介绍Ruby设计模式编程中使用Builder建造者模式的实例,包括了Ruby设计模式编程中使用Builder建造者模式的实例的使用技巧和注意事项,需要的朋友参考一下 先来复习一下设计模式的基本概念: 定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要重新定一个建造者就可以了。 实用范围
介绍 在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法确相对稳定。如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?这就是要说的建造者模式。 建造者模式可以将一个复杂对象的构建与其表
本文向大家介绍深入理解Android中的建造者模式,包括了深入理解Android中的建造者模式的使用技巧和注意事项,需要的朋友参考一下 前言 在Android开发过程中,我发现很多安卓源代码里应用了设计模式,比较常用的有适配器模式(各种adapter),建造者模式(Alert Dialog的构建)等等。虽然我们对大多数设计模式都有所了解,但是在应用设计模式的这个方面,感觉很多人在这方面有所不足。所
本文向大家介绍C# 设计模式系列教程-建造者模式,包括了C# 设计模式系列教程-建造者模式的使用技巧和注意事项,需要的朋友参考一下 1. 概述 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。 2. 建造者模式中的角色 2.1 建造者(Builder):为创建一个产品对象的各个部件指定抽象接口。 2.2 具体建造者(Concret
本文向大家介绍Java运用设计模式中的建造者模式构建项目的实例解析,包括了Java运用设计模式中的建造者模式构建项目的实例解析的使用技巧和注意事项,需要的朋友参考一下 1.建造者模式概念 定义: 将一个复杂的对象构建与其表示相分离,使得同样的构建过程可以创建不同的表示; 核心 : 构建与表示分离,同构建不同表示 区别于 抽象工厂模式 : (1)与抽象工厂模式 相似,因为它也可以创建复杂对象。主要的