1、建造者模式意图:
将一个复杂的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2、适用性:
以下情况适合使用呢建造者模式
.当创造复杂对象的算法一个独立于该对象的组成部分以及它们的装配方式时。
.当构造过程必须允许构造的对象有不同表示时。
3、结构(uml图)
4、参与者
.Builder: 为创建一个对象的各个部件指定抽象接口。
.ConcreteBuilder:实现Builder接口以构造和装配对应产品的各个部件;定义并明确它所创建的表示;提供一个检索产品的接口
.Director:构建一个使用Builder接口的对象。
.Product:表示被构造的复杂对象。ConcreteBuilder创建该产品内部表示并定义它的装配过程;包含定义组成部件的类,包括将这些部件组装成最终的产品接口。
5、作用
建造者模式的主要作用有
.让你可以改变一个产品的内部表示:builder对象提供给导向器一个构造产品的抽象接口。该接口使得生成器可以隐蔽这个产品的表示和内部结构,同时也隐蔽了该产品是如何装配的。因为产品是通过抽象接口构造的,在改变产品的内部表示时所要做的是定义一个新的生成器。
.让将构造代码和表示代码分开:builder模式通过组装一个复杂的创建对象的创建和表示方式提高了对象的模块行。客户不需要知道定义产品的内部结构的类的所有信息;这些类是不出现在builder接口中的。每个ConcreteBuilder包含了创建和组装一个特定产品的所有代码。这些代码只需要写一次;然后不同的Director可以复用相同的部件集合的基础上构造不同的Product。
.让开发者可以对构造过程进行更精细的控制:builder模式和一下子就生产产品的创建型模式不同,它是在导向者的控制下一步一步构造产品的。仅当该产品完成时导向者才从生产器中取回它。因此builder接口相比其他创建型模式能更好的放映产品的构造过程 。这可以使你可以更精细的控制构建过程,从而能更精细的控制所得产品的内部结构。
代码示例:
package main
import (
"fmt"
)
type Glasses struct {
Price int64
From string
}
type Builder interface {
BuildPrice(int64)
BuildForm()
GetGlasses() Glasses
}
type ShenZhenBuilder struct {
glasses Glasses
}
type ShanWeiBuilder struct {
glasses Glasses
}
func (pS *ShenZhenBuilder) BuildPrice(iP int64) {
pS.glasses.Price = iP * 10
}
func (pS *ShenZhenBuilder) BuildForm() {
pS.glasses.From = "shenzhen"
}
func (pS *ShenZhenBuilder) GetGlasses() Glasses {
return pS.glasses
}
func (pS *ShanWeiBuilder) BuildPrice(iP int64) {
pS.glasses.Price = iP * 2
}
func (pS *ShanWeiBuilder) BuildForm() {
pS.glasses.From = "shanwei"
}
func (pS *ShanWeiBuilder) GetGlasses() Glasses {
return pS.glasses
}
type LeshiGlasses struct {
First_cost int64
}
func (L *LeshiGlasses) GetGlasses(b Builder) Glasses {
b.BuildPrice(L.First_cost)
b.BuildForm()
return b.GetGlasses()
}
func main() {
leshi := &LeshiGlasses{First_cost: 100}
var glassesbuilder Builder
glassesbuilder = &ShanWeiBuilder{}
glasses := leshi.GetGlasses(glassesbuilder)
fmt.Println("glasses's price is: ", glasses.Price, " glasses from :", glasses.From)
glassesbuilder = &ShenZhenBuilder{}
glasses = leshi.GetGlasses(glassesbuilder)
fmt.Println("glasses's price is: ", glasses.Price, " glasses from :", glasses.From)
return
}
运行结果:
glasses's price is: 200 glasses from : shanwei
glasses's price is: 1000 glasses from : shenzhen
从例子可以看出。在同一个类型的Director(乐视眼镜下),有不同的构造方法,分别是深圳眼镜和汕尾眼镜。如果要在广州增加一个广州眼镜。只需要增加一个广州眼镜,并实现广州眼镜的时间。对应乐视眼镜构造广州眼镜的方式还是一致的,因为其成本是一致的。如果要增加明凯眼镜,则只需要增加一个明凯眼镜的Director即可。将对眼镜创建的过程,从直接创建,分解到Director和Builder(框架),使得构造代码和表示代码分开。在Builder的具体实现结构可以更加精细的构造每个环节。