$strategyConfig 策略配置(字符串为策略类名,数组包含 class 和 config) * @return PollingStrategyInterface 策略实例 * @throws \InvalidArgumentException 无效的策略配置 */ public static function create(string|array $strategyConfig): PollingStrategyInterface { // 如果配置是字符串,则作为策略类名 if (is_string($strategyConfig)) { $className = $strategyConfig; $strategyConfig = ['class' => $className]; } // 获取策略类名 $className = $strategyConfig['class'] ?? null; if (!$className) { // 如果没有指定策略,使用默认策略 $className = DefaultConsumptionStrategy::class; } // 验证类是否存在 if (!class_exists($className)) { throw new \InvalidArgumentException("策略类不存在: {$className}"); } // 验证类是否实现了接口 if (!is_subclass_of($className, PollingStrategyInterface::class)) { throw new \InvalidArgumentException("策略类必须实现 PollingStrategyInterface: {$className}"); } // 创建策略实例 try { $strategy = new $className(); LoggerHelper::logBusiness('polling_strategy_created', [ 'class' => $className, ]); return $strategy; } catch (\Throwable $e) { LoggerHelper::logError($e, [ 'component' => 'PollingStrategyFactory', 'action' => 'create', 'class' => $className, ]); throw new \RuntimeException("无法创建策略实例: {$className}", 0, $e); } } }