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

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

通过创建函数选择具体实现。

创建型

说明 ​

调用方依赖接口而非构造细节;需要按输入选择实现时,集中创建逻辑。

分析 ​

客户端只知道 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"))
}

继续阅读