第九章 Caché 设计模式 建造者模式

第九章 Caché 设计模式 建造者模式

定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

优点

  • 使用建造者模式可以使客户端不必知道产品内部组成的细节。
  • 具体的建造者类之间是相互独立的,容易拓展。
  • 由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。

缺点

  • 产生多余的Build对象以及导演类。

使用场景

  • 建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时适用的模式。
  • 当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时。
  • 相同的方法,不同的执行顺序,产生不同的事件结果时。
  • 多个部件或零件都可以被装配到一个对象中,但是产生的运行结果又不相同时。
  • 产品类非常复杂,或者产品类种的调用顺序不同而产生了不同的效能。
  • 创建一些复杂的对象时,这些对象的内部组成构件间的建造顺序是稳定的,但是对象的内部组成构件面临着复杂的变化。

结构图

完整示例

产品类

Class PHA.YX.Design.Builder.Product Extends %RegisteredObject
{

Property parts As list Of %String;

Method Add(part As %String)
{
	d ..parts.Insert(part)
}

Method Show()
{
	w "产品 创建-----",!
	f i = 1 : 1 : ..parts.Count() d
	.w ..parts.GetAt(i),!
}

}

抽象建造者类

Class PHA.YX.Design.Builder.Builder Extends %RegisteredObject [ Abstract ]
{

Method BuildPartA() [ Abstract ]
{
}

Method BuildPartB() [ Abstract ]
{
}

Method GetResullt() As Product [ Abstract ]
{
}

}

具体建造者类

Class PHA.YX.Design.Builder.ConcreteBuilder1 Extends Builder
{

Property product As Product [ InitialExpression = {##class(Product).%New()}, Private ];

Method BuildPartA()
{
	d ..product.Add("部件A")
}

Method BuildPartB()
{
	d ..product.Add("部件B")
}

Method GetResullt() As Product
{
	q ..product
}

}

Class PHA.YX.Design.Builder.ConcreteBuilder2 Extends Builder
{

Property product As Product [ InitialExpression = {##class(Product).%New()}, Private ];

Method BuildPartA()
{
	d ..product.Add("部件X")
}

Method BuildPartB()
{
	d ..product.Add("部件Y")
}

Method GetResullt() As Product
{
	q ..product
}

}

指挥者类

Class PHA.YX.Design.Builder.Director Extends %RegisteredObject
{

Method Construct(builder As Builder)
{
	d builder.BuildPartA()
	d builder.BuildPartB()
}

}

调用

/// d ##class(PHA.YX.Design.Program).Builder() 
ClassMethod Builder()
{
	s director = ##class(PHA.YX.Design.Builder.Director).%New()
	# dim b1 as PHA.YX.Design.Builder.ConcreteBuilder1
	s b1 = ##class(PHA.YX.Design.Builder.ConcreteBuilder1).%New()
	# dim b2 as PHA.YX.Design.Builder.ConcreteBuilder2
	s b2 = ##class(PHA.YX.Design.Builder.ConcreteBuilder2).%New()
	
	d director.Construct(b1)
	# dim p1 as PHA.YX.Design.Builder.Product
	s p1 = b1.GetResullt()
	d p1.Show()
	w "--------------",!
	d director.Construct(b2)
	# dim p2 as PHA.YX.Design.Builder.Product
	s p2 = b2.GetResullt()
	d p2.Show()
}

思考

组装一个电脑产品(cpu,键盘,内存),具体建造的过程不可见,如何用建造者模式来实现。
感兴趣的同学实现后可以发我一起参考下。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yaoxin521123

谢谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值