建造者模式: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
就是一些类型它们有相同的构造流程,但是流程中具体的每一步可能有所差距。看下代码就知道了
package builder
type Builder interface {
Part1()
Part2()
Part3()
}
type Director struct {
builder Builder
}
func NewDirector(builder Builder) * Director {
return &Director{
builder: builder,
}
}
func (d *Director)Construct() {
d.builder.Part1()
d.builder.Part2()
d.builder.Part3()
}
type Builder1 struct {
result string
}
func (b *Builder1)Part1() {
b.result += "1"
}
func (b *Builder1)Part2() {
b.result += "2"
}
func (b *Builder1)Part3() {
b.result += "3"
}
func (b *Builder1)GetResult() string {
return b.result
}
//******* builder 2
type Builder2 struct {
result int
}
func (b *Builder2) Part1() {
b.result += 1
}
func (b *Builder2) Part2() {
b.result += 2
}
func (b *Builder2) Part3() {
b.result += 3
}
func (b *Builder2)GetResult() int {
return b.result
}
客户端:
func TestBuilder1(t *testing.T) {
builder := &Builder1{}
director := NewDirector(builder)
director.Construct()
res := builder.GetResult()
if res != "123" {
t.Fatal("Builder1 failed expect 123")
}
fmt.Println(res)
}
func TestBuilder2(t *testing.T) {
builder := &Builder2{}
director := NewDirector(builder)
director.Construct()
res := builder.GetResult()
if res != 6 {
t.Fatal("Builder2 failed expect 6")
}
fmt.Println(res)
}
单例模式就是让某一类型的实例只有一个。有懒汉模式:类型加载的时候就实例化一个对象,后面只能去访问,不能够在创建了;饿汉模式:类型加载的时候还没有实例化对象,只有在第一次访问这个实例的时候才实例化它。饿汉模式需要注意多线程同时初始化导致多次实例化、内存泄露,虽然GO有垃圾回收。
type Singleton struct{}
var singleton *Singleton
var once sync.Once //一次锁
func GetInstance() *Singleton {
once.Do(func() {
singleton = &Singleton{}
} )
return singleton
}