#pragma once #include "XNMonitorServer_global.h" #include "DataMonitor.h" //接口头文件 #include #include #include #include #include #include #include #include #include /** * @brief DataMonitor工厂类,用于创建不同类型的DataMonitor实例 */ class XNMONITORSERVER_EXPORT DataMonitorFactory { public: static DataMonitorBasePtr GetInstance(const std::string &interfaceName) { if (interfaceName == "Aerodynamics_heartbeat") { return GetInstance(); } else if (interfaceName == "Aerodynamics_input") { return GetInstance(); } else if (interfaceName == "Aerodynamics_output") { return GetInstance(); } else if (interfaceName == "GroundHandling_heartbeat") { return GetInstance(); } else if (interfaceName == "GroundHandling_input") { return GetInstance(); } else if (interfaceName == "GroundHandling_output") { return GetInstance(); } else if (interfaceName == "WeightBalance_heartbeat") { return GetInstance(); } else if (interfaceName == "WeightBalance_input") { return GetInstance(); } else if (interfaceName == "WeightBalance_output") { return GetInstance(); } return nullptr; } static void ReleaseInstance(const std::string &interfaceName) { if (interfaceName == "Aerodynamics_heartbeat") { ReleaseInstance(); } else if (interfaceName == "Aerodynamics_input") { ReleaseInstance(); } else if (interfaceName == "Aerodynamics_output") { ReleaseInstance(); } else if (interfaceName == "GroundHandling_heartbeat") { ReleaseInstance(); } else if (interfaceName == "GroundHandling_input") { ReleaseInstance(); } else if (interfaceName == "GroundHandling_output") { ReleaseInstance(); } else if (interfaceName == "WeightBalance_heartbeat") { ReleaseInstance(); } else if (interfaceName == "WeightBalance_input") { ReleaseInstance(); } else if (interfaceName == "WeightBalance_output") { ReleaseInstance(); } } private: /** * @brief 创建DataMonitor实例 * @param framework 框架指针 * @param modelId 模型ID * @param DDS_type DDS类型 * @return 返回创建的DataMonitor实例的智能指针 */ template static DataMonitorBasePtr GetInstance() { std::lock_guard lock(mutex_); // 使用type_index作为键,更可靠的类型标识 std::type_index typeIndex(typeid(T)); // 检查是否已存在实例 auto it = instances_.find(typeIndex); if (it != instances_.end()) { return it->second; } // 创建新实例 auto monitor = std::make_shared>(); instances_[typeIndex] = monitor; return monitor; } /** * @brief 释放指定类型的实例 */ template static void ReleaseInstance() { std::lock_guard lock(mutex_); std::type_index typeIndex(typeid(T)); if (instances_.find(typeIndex) == instances_.end()) { return; } instances_.erase(typeIndex); } private: DataMonitorFactory() = delete; ~DataMonitorFactory() = delete; static std::mutex mutex_; static std::unordered_map instances_; };