贝利信息

Golang新手应该先学哪些设计模式_入门设计模式推荐

日期:2026-01-13 00:00 / 作者:P粉602998670
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
    }
}

sync.Once + 单例:比加锁更安全的懒加载

新手常误用双重检查锁(if instance == nil { mutex.Lock(); ... }),在 Go 里纯属多余。sync.Once 是标准库提供的线程安全单例方案,零出错:

var (
    instance *DBClient
    once     sync.Once
)

func GetDBClient() DBClient { once.Do(func() { instance = &DBClient{ / 初始化逻辑 */ } }) return instance }

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 都会收到 }

真正要警惕的是过早引入“模式感”——比如给两个 if 分支硬套策略模式,或者为一个结构体加一堆接口只为满足“面向接口编程”。先用好这三个,等你写出第二个项目时,factory 自然会拆成结构体,observer 会演变成带缓冲和取消的事件总线,而那时你已经不需要问“该学哪个模式”了。