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) }