100 lines
2.4 KiB
Go
100 lines
2.4 KiB
Go
|
|
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)
|
|||
|
|
}
|