创建型模式:Singleton、Builder、Factory Method、Abstract Factory、Prototype
Singleton 单例设计模式
having a unique instance of a type in the entire program
在整个程序中只具有某一类型的唯一实例
示例:唯一的计数器
package creational
type singleton struct {
count int
}
var instance *singleton
func GetInstance() *singleton {
if instance == nil {
instance = new(singleton)
}
return new(singleton)
}
func (s *singleton) AddOne() int {
s.count++
return s.count
}
测例 go test -v ./patterns/creational -cover
package creational
import (
"testing"
)
func Test_singleton_AddOne(t *testing.T) {
c1 := GetInstance()
currentCount := c1.AddOne()
if currentCount != 1 {
t.Errorf("After calling for the first time to count, the count must be1 but it is %d\n", currentCount)
}
c2 := GetInstance()
currentCount = c2.AddOne()
if currentCount != 2 {
t.Errorf("After calling 'AddOne' using the second counter, the currentcount must be 2 but was %d\n", currentCount)
}
}
func TestGetInstance(t *testing.T) {
c1 := GetInstance()
c2 := GetInstance()
if c1 == nil || c2 == nil {
t.Errorf("expected pointer to Singleton after calling GetInstance(), not nil")
}
if c1 != c2 {
t.Errorf("Expected same instance in counter2 but it got a different instance")
}
}
Builder 建造者设计模式
reusing an algorithm to create many implementations of an interface
重用某个算法来创建接口的多个实现
例如,你将使用几乎相同的技术来建造一辆汽车,你将建造一辆公共汽车,除了他们将不同的大小和座位的数量,所以我们为什么不重复建造过程(组装结构,放置车轮,放置座椅)?
示例:车辆制造
核心思想:ManufacturingDirector负责重用建造过程
package creational
//产品接口,开放更改
type VehicleProduct struct {
Wheels int
Seats int
Structure string
}
//定义一组车辆建造的行为
type BuildProcess interface {
SetWheels() BuildProcess
SetSeats() BuildProcess
SetStructure() BuildProcess
Build() VehicleProduct
}
//----------导演
type ManufacturingDirector struct {
bp BuildProcess
}
//使用BuildProcess进行产品构造
func (f *ManufacturingDirector) Construct() {
//Implementation goes here
f.bp.SetSeats().SetWheels().SetStructure()
}
func (f *ManufacturingDirector) SetBuilder(b BuildProcess) {
//Implementation goes here
f.bp = b
}
//----------小车建造器
type CarBuilder struct {
v VehicleProduct
}
func (c *CarBuilder) SetWheels() BuildProcess {
c.v.Wheels = 4
return c
}
func (c *CarBuilder) SetSeats() BuildProcess {
c.v.Seats = 5
return c
}
func (c *CarBuilder) SetStructure() BuildProcess {
c.v.Structure = "Car"
return c
}
func (c *CarBuilder) Build() VehicleProduct {
return c.v }
//--------摩托车建造器
type BikeBuilder struct {
v VehicleProduct
}
func (b *BikeBuilder) SetWheels() BuildProcess {
b.v.Wheels = 2
return b
}
func (b *BikeBuilder) SetSeats() BuildProcess {
b.v.Seats = 2
return b
}
func (b *BikeBuilder) SetStructure() BuildProcess {
b.v.Structure = "Motorbike"
return b
}
func (b *BikeBuilder) Build() VehicleProduct {
return b.v }
测例
package creational
import &#