工厂模式与在open Harmony连接模块中设计实现 一、总述Introduction工厂模式Factory Pattern是软件工程中一种经典的创建型设计模式Creational Design Pattern它的核心思想是将对象的创建过程封装起来调用方无需关心具体实现细节只需通过统一的接口获取所需对象。在鸿蒙软总线SoftBus的连接模块中工厂模式被广泛应用。软总线需要支持多种连接方式蓝牙BR、低功耗蓝牙BLE、TCP、P2P等通过工厂模式系统能够以统一的方式管理这些差异巨大的连接技术实现一个接口多种实现的优雅设计。二、工厂模式核心概念Core Concepts of Factory Pattern2.1 什么是工厂模式工厂模式就像现实生活中的工厂客户Client只需要告诉工厂我要什么产品工厂Factory负责生产具体产品客户不需要知道生产过程产品Product工厂产出的具体对象2.2 工厂模式的三种常见形式类型说明适用场景简单工厂Simple Factory一个工厂根据参数决定创建哪种产品产品类型较少工厂方法Factory Method每种产品对应一个具体工厂产品类型较多需要扩展抽象工厂Abstract Factory工厂本身也是抽象的可以创建产品族需要创建一系列相关产品三、软总线连接模块的工厂模式设计Factory Pattern in SoftBus Connection Module3.1 整体架构概览Architecture Overview软总线连接模块采用了**接口定义 工厂注册 统一调度**的工厂模式架构3.2 核心代码解析Core Code Analysis3.2.1 统一接口定义Unified Interface Definition在 softbus_conn_manager.h 中ConnectFuncInterface结构体定义了所有连接类型必须实现的标准接口typedef struct { // 连接设备Connect Device int32_t (*ConnectDevice)(const ConnectOption *option, uint32_t requestId, const ConnectResult *result); // 发送数据Send Data int32_t (*PostBytes)(uint32_t connectionId, uint8_t *data, uint32_t len, ...); // 断开设备Disconnect Device int32_t (*DisconnectDevice)(uint32_t connectionId); // 获取连接信息Get Connection Info int32_t (*GetConnectionInfo)(uint32_t connectionId, ConnectionInfo *info); // 启动监听Start Listening int32_t (*StartLocalListening)(const LocalListenerInfo *info); // 停止监听Stop Listening int32_t (*StopLocalListening)(const LocalListenerInfo *info); // ... 其他接口 } ConnectFuncInterface;设计要点这是一个函数指针集合Collection of Function Pointers类似于面向对象中的抽象接口。每种连接类型BR/BLE/TCP都需要实现这些接口。3.2.2 工厂注册表Factory Registry在 softbus_conn_manager.c 中通过数组维护所有连接类型的工厂实例ConnectFuncInterface *g_connManager[CONNECT_TYPE_MAX] { 0 };其中ConnectType枚举定义了所有支持的连接类型typedef enum { CONNECT_TCP 1, // TCP连接 CONNECT_BR, // 经典蓝牙 CONNECT_BLE, // 低功耗蓝牙 CONNECT_P2P, // WiFi P2P CONNECT_P2P_REUSE, // P2P复用 CONNECT_BLE_DIRECT, // BLE直连 CONNECT_HML, // HML连接 CONNECT_TRIGGER_HML, // 触发HML CONNECT_TYPE_MAX // 最大值标记 } ConnectType;3.2.3 工厂初始化Factory Initialization每种连接类型通过独立的初始化函数创建并注册到工厂// BR蓝牙管理器初始化BR Manager Initialization ConnectFuncInterface *ConnInitBr(const ConnectCallback *callback); // BLE管理器初始化BLE Manager Initialization ConnectFuncInterface *ConnInitBle(const ConnectCallback *callback); // TCP管理器初始化TCP Manager Initialization ConnectFuncInterface *ConnInitTcp(const ConnectCallback *callback);这些初始化函数在系统启动时被调用将具体的管理器实例注册到g_connManager数组中。3.3 统一调度机制Unified Dispatch Mechanism当业务模块需要连接设备时调用统一的ConnConnectDevice接口int32_t ConnConnectDevice(const ConnectOption *info, uint32_t requestId, const ConnectResult *result) { if (info NULL) { return SOFTBUS_INVALID_PARAM; } // 检查连接类型是否有效Check if connection type is valid if (ConnTypeCheck(info-type) ! SOFTBUS_OK) { return SOFTBUS_CONN_MANAGER_TYPE_NOT_SUPPORT; } // 通过工厂获取对应的连接管理器并调用Get corresponding manager from factory and call if (g_connManager[info-type]-ConnectDevice NULL) { return SOFTBUS_CONN_MANAGER_OP_NOT_SUPPORT; } // 实际调用具体实现Actually call the specific implementation return g_connManager[info-type]-ConnectDevice(info, requestId, result); }关键流程参数校验Parameter Validation类型检查Type Checking从工厂获取对应管理器Get Manager from Factory调用具体实现Call Specific Implementation四、BLE协议接口工厂实例BLE Protocol Interface Factory Example在 ble_protocol_interface_factory.c 中展示了另一种工厂模式的实现方式// 静态工厂数组Static Factory Array static BleUnifyInterface g_bleUnifyInterface[BLE_PROTOCOL_MAX] { [BLE_GATT] { .bleClientConnect ConnGattClientConnect, .bleClientDisconnect ConnGattClientDisconnect, .bleClientSend ConnGattClientSend, .bleClientUpdatePriority ConnGattClientUpdatePriority, .bleServerStartService ConnGattServerStartService, .bleServerStopService ConnGattServerStopService, .bleServerSend ConnGattServerSend, .bleServerDisconnect ConnGattServerDisconnect, .bleServerConnect ConnGattServerConnect, .bleClientInitModule ConnGattInitClientModule, .bleServerInitModule ConnGattInitServerModule, } }; // 工厂获取方法Factory Get Method const BleUnifyInterface *ConnBleGetUnifyInterface(BleProtocolType type) { if (type ! BLE_GATT) { CONN_LOGE(CONN_BLE, Failed to return type.); return NULL; } return g_bleUnifyInterface[type]; }设计特点使用静态数组作为工厂存储Static Array as Factory Storage通过类型索引直接获取对应实现Direct Access via Type Index支持协议扩展只需在数组中添加新条目即可五、C版本的工厂模式C Version Factory Pattern在 WiFi Direct 模块中使用了更现代的 C 工厂模式实现5.1 Executor 工厂Executor Factory在 wifi_direct_executor_factory.h 中class WifiDirectExecutorFactory { public: // 单例模式获取实例Singleton Pattern to Get Instance static WifiDirectExecutorFactory GetInstance() { static WifiDirectExecutorFactory instance; return instance; } // 函数指针类型定义Function Pointer Type Definition using ExecutorGenerator std::functionstd::shared_ptrWifiDirectExecutor(...); // 创建执行器Create Executor std::shared_ptrWifiDirectExecutor NewExecutor(...) { // 如果注册了自定义生成器使用自定义逻辑 // If custom generator is registered, use custom logic std::shared_ptrWifiDirectExecutor executor (executorGenerator_ nullptr) ? std::make_sharedWifiDirectExecutor(...) : executorGenerator_(...); executor-Start(); return executor; } // 注册自定义生成器Register Custom Generator void Register(ExecutorGenerator generator) { executorGenerator_ std::move(generator); } private: ExecutorGenerator executorGenerator_; };设计亮点单例模式Singleton Pattern确保工厂全局唯一可插拔设计Pluggable Design支持运行时注册自定义生成器智能指针Smart Pointer自动管理对象生命周期六、工厂模式在软总线中的优势Advantages in SoftBus6.1 解耦合Decoupling业务模块 ──不直接依赖── 具体连接实现 业务模块 ──只依赖── ConnectFuncInterface 接口业务模块如认证模块、消息服务不需要知道底层是蓝牙还是TCP只需调用统一接口。6.2 易扩展Easy to Extend当需要添加新的连接类型如 WiFi 6、UWB 等时实现ConnectFuncInterface接口在ConnectType枚举中添加新类型编写初始化函数并注册到g_connManager无需修改现有代码符合开闭原则Open-Closed Principle。6.3 统一调度Unified Dispatch// 发送数据时自动根据 connectionId 判断连接类型 int32_t ConnPostBytes(uint32_t connectionId, ConnPostData *data) { ConnectType type; ConnGetTypeByConnectionId(connectionId, type); // 自动识别类型 return g_connManager[type]-PostBytes(...); // 调用对应实现 }6.4 生命周期管理Lifecycle Management每种连接类型的创建、初始化、销毁都由各自的工厂统一管理避免资源泄漏。七、连接流程示例Connection Flow Example以蓝牙BR连接为例完整流程如下1. 业务模块调用 ConnConnectDevice(option, requestId, result) ↓ 2. 连接管理器检查 option-type CONNECT_BR ↓ 3. 从 g_connManager[CONNECT_BR] 获取 BR 管理器实例 ↓ 4. 调用 BR 管理器的 ConnectDevice 方法 ↓ 5. BR 管理器创建 ConnBrDevice 和 ConnBrConnection 对象 ↓ 6. 底层蓝牙协议栈发起物理连接 ↓ 7. 连接成功后通过回调通知业务模块 ↓ 8. 后续数据发送通过统一的 ConnPostBytes 接口八、总结Conclusion软总线连接模块的工厂模式设计体现了以下核心思想设计原则体现方式单一职责Single Responsibility每种连接类型独立实现互不干扰开闭原则Open-Closed对扩展开放对修改封闭依赖倒置Dependency Inversion依赖抽象接口而非具体实现接口隔离Interface Segregation精简统一的接口定义通过工厂模式软总线实现了统一抽象Unified AbstractionConnectFuncInterface定义标准接口灵活扩展Flexible Extension新增连接类型无需改动核心逻辑透明调用Transparent Invocation调用方无需关心底层实现资源管理Resource Management工厂统一管理对象生命周期这种设计使得软总线能够优雅地支持多种连接技术为鸿蒙系统的分布式能力提供了坚实的基础设施支撑。