设计模式与动态语言之建造者模式 Builder

建造者模式是一种比较常用的简单的对象创建型设计模式。
它在软件系统中,主要用于面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法确相对稳定。

[b]
意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。[/b]

结构:

[img]http://dl.iteye.com/upload/attachment/193261/b5f8810e-1113-30ad-aaf5-fb6f1e709ffb.png[/img]

适用性:
[list]
[*]需要生成的产品对象有复杂的内部结构。
[*]需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
[*]在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。
[*]
[/list]

动态性:
此模式在动态性方面没有特别的动态特性。

效果:
建造者模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节;
每一个Builder都相对独立,而与其它的Builder无关;
可使对构造过程更加精细控制;
建造者模式的缺点在于难于应付“分步骤构建算法”的需求变动。


下面是个小例子:



class Director
def build(builder)
[:header, :toolbar, :content, :footer].each do |m|
builder.send("build_#{m}")
end
end
end

class BlueWindowBuilder
def build_header
BlueHeader.new
end

def build_toolbar
BlueToolbar.new
end

def build_content
BlueContent.new
end

def build_footer
BlueFooter.new
end
end

class BlueHeader
def initialize
@bg = 'Blue'
@title = 'Blue window'
puts "Build #{self.class.name}"
end
end

class BlueToolbar
def initialize
@bg = 'light blue'
@buttons_bg = 'blue'
puts "Build #{self.class.name}"
end
end

class BlueContent
def initialize
@bg = 'gray'
puts "Build #{self.class.name}"
end
end

class BlueFooter
def initialize
@font_color = 'white'
puts "Build #{self.class.name}"
end
end

class GrayWindowBuilder
def build_header
GrayHeader.new
end

def build_toolbar
GrayToolbar.new
end

def build_content
GrayContent.new
end

def build_footer
GrayFooter.new
end
end

class GrayHeader
def initialize
@bg = 'Gray'
@title = 'Gray window'
puts "Build #{self.class.name}"
end
end

class GrayToolbar
def initialize
@bg = 'Black'
@buttons_bg = 'gray'
puts "Build #{self.class.name}"
end
end

class GrayContent
def initialize
@bg = 'white'
puts "Build #{self.class.name}"
end
end

class GrayFooter
def initialize
@font_color = 'black'
puts "Build #{self.class.name}"
end
end

dir = Director.new
puts "\nBuilding blue window ...\n"
dir.build(BlueWindowBuilder.new)
puts "\nBuild Gray window ...\n"
dir.build(GrayWindowBuilder.new)


类图:

[img]http://dl.iteye.com/upload/attachment/193379/c43ccce7-d2f0-31bd-afd3-1a20dae90601.jpg[/img]


[url=http://dl.iteye.com/topics/download/ac38c16f-afee-374d-82f1-09cad93f8a77]点击下载UML及源码[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值