Go语言设计模式从入门到精通:完整示例指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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

博客

书籍推荐