Go语言设计模式从入门到精通:完整示例指南
设计模式(Design Patterns)是经过时间验证的架构解决方案,能帮助Go开发者创建灵活、可扩展且易于维护的代码。与经典面向对象语言不同,Go通过接口、组合和goroutine提供了实现模式的独特方式。本文将结合具体代码示例,深入解析Go语言中的主要设计模式。
1. 创建型模式(Creational Patterns)
创建型模式负责对象的创建,使系统与对象的创建方式解耦。
1.1. 单例模式(Singleton)
单例模式确保一个类只有一个实例。在Go中,通常通过sync.Once实现线程安全。
package main
import ( "fmt" "sync")
type Database struct { connection string}
var ( instance *Database once sync.Once)
func GetDatabaseInstance() *Database { once.Do(func() { instance = &Database{connection: "postgres://localhost:5432/mydb"} fmt.Println("已创建唯一的数据库连接") }) return instance}
func main() { db1 := GetDatabaseInstance() db2 := GetDatabaseInstance() fmt.Println(db1 == db2) // true}1.2. 工厂方法模式(Factory Method)
工厂方法将对象的创建委托给子类。在Go中通过接口实现。
package main
import "fmt"
// 产品接口type Transport interface { Deliver() string}
// 具体产品type Truck struct{}func (t Truck) Deliver() string { return "陆路运输" }
type Ship struct{}func (s Ship) Deliver() string { return "海上运输" }
// 工厂type LogisticsFactory interface { CreateTransport() Transport}
type RoadLogistics struct{}func (r RoadLogistics) CreateTransport() Transport { return Truck{} }
type SeaLogistics struct{}func (s SeaLogistics) CreateTransport() Transport { return Ship{} }
func main() { var factory LogisticsFactory = RoadLogistics{} transport := factory.CreateTransport() fmt.Println(transport.Deliver()) // 陆路运输}2. 结构型模式(Structural Patterns)
结构型模式帮助将类和对象组织成更大的结构。
2.1. 适配器模式(Adapter)
适配器允许接口不兼容的对象协同工作。在Go中通过包装器实现。
package main
import "fmt"
// 旧接口type OldPrinter interface { PrintOld(data string)}
type LegacyPrinter struct{}func (l LegacyPrinter) PrintOld(data string) { fmt.Println("Legacy:", data)}
// 新接口type NewPrinter interface { PrintNew(data string)}
// 适配器type PrinterAdapter struct { OldPrinter OldPrinter}
func (a PrinterAdapter) PrintNew(data string) { a.OldPrinter.PrintOld(data)}
func main() { legacy := LegacyPrinter{} adapter := PrinterAdapter{OldPrinter: legacy} adapter.PrintNew("Hello, Go!") // Legacy: Hello, Go!}2.2. 组合模式(Composite)
组合模式允许将对象组视为单个对象。非常适合树形结构。
package main
import "fmt"
// 组件接口type Graphic interface { Draw() string}
// 叶子元素type Circle struct{}func (c Circle) Draw() string { return "绘制圆形" }
// 容器type CompoundGraphic struct { children []Graphic}
func (cg *CompoundGraphic) Add(g Graphic) { cg.children = append(cg.children, g)}
func (cg *CompoundGraphic) Draw() string { result := "组合图形:" for _, child := range cg.children { result += " - " + c