Go新手应优先掌握简单工厂、单例、观察者这3种模式,因其高频实用、实现轻量:简单工厂统一对象创建逻辑,sync.Once实现安全懒加载单例,channel+闭包构建松耦合观察者。

Go 新手不必一上来就啃全23种设计模式,真正该优先掌握的只有 3 个:简单工厂模式、单例模式、观察者模式。它们在 Go 工程中出现频率高、实现简洁、能立刻解决真实问题,且不会引入过度抽象。
为什么是这三个?不是策略/装饰器/适配器?
因为新手最常卡在三个具体场景:怎么根据配置创建不同对象(比如日志用 JsonParser 还是 YamlParser)、怎么保证全局只有一份数据库连接或配置实例、怎么让模块之间松耦合地通信(比如配置变更后通知多个服务重载)。而这三个模式正好一一对应,且 Go 的语法特性(如接口、匿名函数、sync.Once)让其实现非常轻量——没有继承、没有抽象类、不依赖框架。
simple_factory:用一个函数替代 if-else 创建对象
新手最容易写死逻辑:if config.Type == "json" { return &JsonParser{} },分散在多处,难维护。简单工厂把它收口到一个函数里:
func NewConfig(t ConfigType) ConfigParser {
switch t {
case JsonType:
return &JsonParser{}
case YamlType:
return &YamlParser{}
default:
return nil
}
}- ✅ 使用场景:初始化配置解析器、选择数据库驱动、加载不同消息队列客户端
- ⚠️ 容易踩的坑:别把工厂函数写成全局变量(如
var factory = NewConfig),它应该每次调用都返回新实例;如果需要复用,应封装为结构体 + 方法 - ? Go 特色:返回
interface{}或自定义接口即可,无需“抽象工厂”那套层级
sync.Once + 单例:比加锁更安全的懒加载
新手常误用双重检查锁(if instance == nil { mutex.Lock(); ... }),在 Go 里纯属多余。sync.Once 是标准库提供的线程安全单例方案,零出错:
《PHP设计模式》首先介绍了设计模式,讲述了设计模式的使用及重要性,并且详细说明了应用设计模式的场合。接下来,本书通过代码示例介绍了许多设计模式。最后,本书通过全面深入的案例分析说明了如何使用设计模式来计划新的应用程序,如何采用PHP语言编写这些模式,以及如何使用书中介绍的设计模式修正和重构已有的代码块。作者采用专业的、便于使用的格式来介绍相关的概念,自学成才的编程人员与经过更多正规培训的编程人员
立即学习“go语言免费学习笔记(深入)”;
var (
instance *DBClient
once sync.Once
)
func GetDBClient() DBClient {
once.Do(func() {
instance = &DBClient{ / 初始化逻辑 */ }
})
return instance
}
- ✅ 使用场景:数据库连接池、全局配置管理器、Prometheus 指标注册器
- ⚠️ 容易踩的坑:不要在
once.Do外部做instance == nil判断并提前 return,这会破坏懒加载语义;也不要试图在once.Do里 panic —— 它只会执行一次,失败后永远无法重试 - ? 性能影响:
sync.Once内部使用原子操作,首次调用有微小开销,之后是纯指针返回,几乎无成本
observer 模式:用 channel 和闭包替代“注册/通知”类库
新手看到 Java/C# 的 addObserver() 往往想抄接口+列表,但在 Go 里更自然的做法是:用 chan 推送事件,用闭包捕获上下文。例如配置热更新:
type Config struct {
Value string
notifyCh chan string
}
func (c *Config) Watch(f func(string)) {
go func() {
for v := range c.notifyCh {
f(v)
}
}()
}
func (c *Config) Update(v string) {
c.Value = v
c.notifyCh <- v // 所有 Watcher 都会收到
}
- ✅ 使用场景:服务配置变更通知、状态机流转广播、指标采集触发
- ⚠️ 容易踩的坑:忘记启动 goroutine 处理
chan(导致发送阻塞)、没关闭chan引发 goroutine 泄漏、用 map 存 observer 导致并发读写 panic - ? Go 特色:不需要定义
Observer接口,函数类型func(string)就是天然观察者
真正要警惕的是过早引入“模式感”——比如给两个 if 分支硬套策略模式,或者为一个结构体加一堆接口只为满足“面向接口编程”。先用好这三个,等你写出第二个项目时,factory 自然会拆成结构体,observer 会演变成带缓冲和取消的事件总线,而那时你已经不需要问“该学哪个模式”了。









