第九章 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,键盘,内存),具体建造的过程不可见,如何用建造者模式来实现。
感兴趣的同学实现后可以发我一起参考下。