Files
go-common/docs/factory.md
2025-11-30 13:34:50 +08:00

204 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 工厂工具文档
## 概述
工厂工具提供了从配置直接创建已初始化的客户端对象的功能,避免调用方重复实现创建逻辑。
## 功能特性
- 从配置直接创建已初始化的客户端对象
- 统一的工厂接口
- 避免调用方重复实现创建逻辑
## 使用方法
### 1. 创建工厂实例
```go
import (
"git.toowon.com/jimmy/go-commom/config"
"git.toowon.com/jimmy/go-commom/factory"
)
// 加载配置
cfg, err := config.LoadFromFile("./config.json")
if err != nil {
log.Fatal(err)
}
// 创建工厂实例
fac := factory.NewFactory(cfg)
```
### 2. 获取邮件客户端(已初始化)
```go
// 直接获取已初始化的邮件客户端
emailClient, err := fac.GetEmailClient()
if err != nil {
log.Fatal(err)
}
// 直接使用,无需再创建
err = emailClient.SendSimple(
[]string{"recipient@example.com"},
"主题",
"正文",
)
```
### 3. 获取短信客户端(已初始化)
```go
// 直接获取已初始化的短信客户端
smsClient, err := fac.GetSMSClient()
if err != nil {
log.Fatal(err)
}
// 直接使用,无需再创建
resp, err := smsClient.SendSimple(
[]string{"13800138000"},
map[string]string{"code": "123456"},
)
```
### 4. 完整示例
```go
package main
import (
"log"
"git.toowon.com/jimmy/go-commom/config"
"git.toowon.com/jimmy/go-commom/factory"
)
func main() {
// 加载配置
cfg, err := config.LoadFromFile("./config.json")
if err != nil {
log.Fatal(err)
}
// 创建工厂
fac := factory.NewFactory(cfg)
// 获取邮件客户端(已初始化,可直接使用)
emailClient, err := fac.GetEmailClient()
if err != nil {
log.Printf("Email client not available: %v", err)
} else {
// 直接使用
err = emailClient.SendSimple(
[]string{"recipient@example.com"},
"测试邮件",
"这是测试内容",
)
if err != nil {
log.Printf("Failed to send email: %v", err)
}
}
// 获取短信客户端(已初始化,可直接使用)
smsClient, err := fac.GetSMSClient()
if err != nil {
log.Printf("SMS client not available: %v", err)
} else {
// 直接使用
resp, err := smsClient.SendSimple(
[]string{"13800138000"},
map[string]string{"code": "123456"},
)
if err != nil {
log.Printf("Failed to send SMS: %v", err)
} else {
log.Printf("SMS sent: %s", resp.RequestID)
}
}
// 如果需要访问配置对象
cfgObj := fac.GetConfig()
dsn, _ := cfgObj.GetDatabaseDSN()
log.Printf("Database DSN: %s", dsn)
}
```
## API 参考
### NewFactory(cfg *config.Config) *Factory
创建工厂实例。
**参数:**
- `cfg`: 配置对象
**返回:** 工厂实例
### (f *Factory) GetEmailClient() (*email.Email, error)
获取邮件客户端(已初始化)。
**返回:** 已初始化的邮件客户端对象和错误信息
**说明:** 如果邮件配置为nil返回错误。
### (f *Factory) GetSMSClient() (*sms.SMS, error)
获取短信客户端(已初始化)。
**返回:** 已初始化的短信客户端对象和错误信息
**说明:** 如果短信配置为nil返回错误。
### (f *Factory) GetConfig() *config.Config
获取配置对象。
**返回:** 配置对象
## 优势
### 之前的方式(需要调用方实现)
```go
// 调用方需要自己实现创建逻辑
cfg, _ := config.LoadFromFile("./config.json")
emailConfig := cfg.GetEmail()
if emailConfig == nil {
log.Fatal("email config is nil")
}
emailClient, err := email.NewEmail(emailConfig)
if err != nil {
log.Fatal(err)
}
// 才能使用
emailClient.SendSimple(...)
```
### 使用工厂方式(直接获取已初始化对象)
```go
// 直接获取已初始化的对象,无需重复实现
cfg, _ := config.LoadFromFile("./config.json")
fac := factory.NewFactory(cfg)
emailClient, err := fac.GetEmailClient()
if err != nil {
log.Fatal(err)
}
// 直接使用
emailClient.SendSimple(...)
```
## 注意事项
1. **配置检查**工厂方法会自动检查配置是否存在如果配置为nil会返回错误
2. **错误处理**所有Get方法都可能返回错误需要正确处理
3. **配置对象**:可以通过`GetConfig()`方法访问原始配置对象,获取其他配置信息
## 示例
完整示例请参考 `examples/factory_example.go`