简单工厂:按输入选择实现
通过创建函数选择具体实现。
创建型
说明
调用方依赖接口而非构造细节;需要按输入选择实现时,集中创建逻辑。
分析
客户端只知道 Sender 接口,具体返回 Email 还是 SMS 由创建函数决定。新增发送渠道时,可以把选择和初始化留在工厂中,而业务流程继续调用 Send。
这里实际演示按字符串分支的简单工厂;经典 GoF 工厂方法强调由子类型重写创建步骤,二者意图相关但结构不同。NewSender 只对 sms 特判,其他值包括拼写错误均返回 Email。渠道来自外部输入时,静默回退可能投递到错误通道,应另定义未知类型的错误行为。
查看图表代码
适用前提与边界
实现种类很少且没有初始化差异时,普通构造函数通常更直接。 创建过程没有复用或选择需求时,直接构造通常更清楚。
示例输入与调用
go
sender := NewSender("sms")
fmt.Println(sender.Send("hello"))运行输出
text
sms: hello完整 Go 示例
go
package main
import "fmt"
type Sender interface{ Send(string) string }
type Email struct{}
func (Email) Send(s string) string {
return "email: " + s
}
type SMS struct{}
func (SMS) Send(s string) string {
return "sms: " + s
}
func NewSender(kind string) Sender {
if kind == "sms" {
return SMS{}
}
return Email{}
}
func main() {
sender := NewSender("sms")
fmt.Println(sender.Send("hello"))
}继续阅读
- 设计意图与对象责任
- 设计意图与对象责任
- 设计意图与对象责任