单例模式 单例模式是比较常使用的一种模式,比如构建一个config工具包,我们只需要一个读写config的对象。在golang 中sysnc.Once刚好用来实现单例模式。
type config map [ string ] string
var (
once sync. Once
instance config
)
func Config ( ) {
once. Do ( func ( ) {
instance = make ( config)
} )
return instance
}
对象池 对象池用来保持多个实例。通常用来处理对象新建成本高的场景,比如数据库的连接,底层就会有对象池的存在。一个简单的实现是用channel模拟池子,从中取出对象实例,用完之后重新放入。
type Pool chan * Object
func New ( total int ) * Pool{
p := make ( Pool. total)
for i := 0 ; i< total; i++ {
p <= new ( Object)
}
return & p
}
p := New ( 2 )
obj <- p
p <- obj
工厂模式 通俗点说 ,工厂模式只是提供了一条生产线,最后出来的东西,根据你给的原料的不同而不同,它推迟了实例的具体实现。
type StorageType int
const (
DiskStorage StorageType = 1 << iota
TempStorage
MemoryStorage
)
func NewStore ( t StorageType) Store {
switch t {
case MemoryStorage:
return newMemoryStorage ( )
case DiskStorage:
return newDiskStorage ( )
default :
return newTempStorage ( )
}
}
s, _ := data. NewStore ( data. MemoryStorage)
f, _ := s. Open ( "file" )
n, _ := f. Write ( [ ] byte ( "data" ) )
defer f. Close ( )
和工厂模式相近的是建造者模式,也可以把建造者模式理解成是一个生产线,但是这个生产线的重点是多种原料之间的组合关系。
type Speed float64
const (
MPH Speed = 1
KPH = 1.60934
)
type Color string
const (
BlueColor Color = "blue"
GreenColor = "green"
RedColor = "red"
)
type Wheels string
const (
SportsWheels Wheels = "sports"
SteelWheels = "steel"
)
type Builder interface {
Color ( Color) Builder
Wheels ( Wheels) Builder
TopSpeed ( Speed) Builder
Build ( ) Interface
}
type Interface interface {
Drive ( ) error
Stop ( ) error
}
assembly := car. NewBuilder ( ) . Paint ( car. RedColor)
familyCar := assembly. Wheels ( car. SportsWheels) . TopSpeed ( 50 * car. MPH) . Build ( )
familyCar. Drive ( )
sportsCar := assembly. Wheels ( car. SteelWheels) . TopSpeed ( 150 * car. MPH) . Build ( )
sportsCar. Drive ( )