Skip to content
← 返回设计模式列表
设计意图与对象责任

创建型设计模式 ​

本页按场景选择方法;通过各条目链接阅读完整推演、源码和输出。

前置是结构体、接口与方法;每个 package main 单独保存为新模块的 main.go,不能将五个入口拼接。下文输出为静态推导,本轮未执行。构建器和工厂只演示对象创建;NewSender 对非 sms 的输入全部回退 Email,Build 不做字段校验。

要解决的问题可选方法选择前确认
按输入选择一个具体实现简单工厂示例把 Sender 的选择集中在创建函数;种类少且初始化简单时普通构造函数更直接。
一起创建必须相互匹配的组件抽象工厂适合产品族切换;增加产品种类需要修改所有工厂接口和实现。
逐步设置很多可选字段建造者可在构建阶段表达约束;示例 Build 仅返回对象,字段少时结构体字面量更简单。
从已有配置复制并只修改少数字段原型切片、映射和指针的浅拷贝可能共享可变数据;示例额外复制 Tags。
复用初始化成本高的共享对象单例sync.Once 保证初始化一次;共享可变状态可能让测试相互影响。

选择单个实现或一整套匹配组件 ​

简单工厂:按输入选择实现 ​

正文、推演与完整示例:简单工厂:按输入选择实现。

这里具体是按 kind 分支的简单工厂,不是依赖子类型重写创建方法的经典工厂方法;保留原路径和章节锚点便于查阅。客户端只知道 Sender 接口,具体返回 Email 还是 SMS 由创建函数决定。新增发送渠道时,可以把选择和初始化留在工厂中,而业务流程继续调用 Send。

实现种类很少且没有初始化差异时,普通构造函数通常更直接。

抽象工厂 ​

正文、推演与完整示例:抽象工厂。

代价是增加新产品种类时需要修改所有工厂接口和实现。

分步组装新对象或从已有对象复制 ​

建造者 ​

正文、推演与完整示例:建造者。

字段很少且没有校验时,直接使用结构体字面量更符合 Go 的习惯。

原型 ​

正文、推演与完整示例:原型。

若 Clone 只复制 Tags 的切片描述符而没有复制底层数组,修改克隆体的标签也会影响原对象;本例通过另建切片复制标签,隔离这一层可变数据。

统一初始化并复用共享实例 ​

单例 ​

正文、推演与完整示例:单例。

单例会引入共享状态,测试时尤其要避免让不同用例相互影响。

静态自检 ​

把原型 Clone 中 Tags 的复制删去,修改克隆标签会怎样?再说明 sync.Once 是否让 Name 后续写入自动安全。提示:区分初始化和使用。

参考解法

标签共享底层数组,修改克隆会影响原值;Once 只约束一次初始化,返回对象后同时读写 Name 仍需锁或不可变约定。

继续阅读