Files
yoyo/internal/provider/factory.go

100 lines
2.4 KiB
Go
Raw Normal View History

package provider
import (
"fmt"
"sync"
)
// ProviderFactory 厂商工厂
type ProviderFactory struct {
providers map[string]func(ProviderConfig) (Provider, error)
mu sync.RWMutex
}
// NewProviderFactory 创建工厂实例
func NewProviderFactory() *ProviderFactory {
factory := &ProviderFactory{
providers: make(map[string]func(ProviderConfig) (Provider, error)),
}
// 注册所有厂商(延迟注册,避免循环依赖)
// 实际注册在init()函数中完成
return factory
}
// Register 注册厂商构造函数
func (f *ProviderFactory) Register(name string, creator func(ProviderConfig) (Provider, error)) {
f.mu.Lock()
defer f.mu.Unlock()
f.providers[name] = creator
}
// Create 创建厂商实例
func (f *ProviderFactory) Create(name string, config ProviderConfig) (Provider, error) {
f.mu.RLock()
creator, exists := f.providers[name]
f.mu.RUnlock()
if !exists {
return nil, fmt.Errorf("不支持的厂商: %s", name)
}
provider, err := creator(config)
if err != nil {
return nil, fmt.Errorf("创建厂商实例失败: %w", err)
}
if err := provider.Validate(); err != nil {
return nil, fmt.Errorf("厂商配置验证失败: %w", err)
}
return provider, nil
}
// HasProvider 检查是否支持指定厂商
func (f *ProviderFactory) HasProvider(name string) bool {
f.mu.RLock()
defer f.mu.RUnlock()
_, exists := f.providers[name]
return exists
}
// GetSupportedProviders 获取所有支持的厂商
func (f *ProviderFactory) GetSupportedProviders() []string {
f.mu.RLock()
defer f.mu.RUnlock()
providers := make([]string, 0, len(f.providers))
for name := range f.providers {
providers = append(providers, name)
}
return providers
}
// 全局工厂实例
var defaultFactory *ProviderFactory
// init 初始化默认工厂
func init() {
defaultFactory = NewProviderFactory()
// 这里可以注册厂商但由于循环依赖实际注册会在各厂商的init()中完成
// 或者在main包中手动注册
}
// GetDefaultFactory 获取默认工厂
func GetDefaultFactory() *ProviderFactory {
return defaultFactory
}
// CreateProvider 使用默认工厂创建厂商
func CreateProvider(name string, config ProviderConfig) (Provider, error) {
return defaultFactory.Create(name, config)
}
// RegisterProvider 注册厂商到默认工厂
func RegisterProvider(name string, creator func(ProviderConfig) (Provider, error)) {
defaultFactory.Register(name, creator)
}