工厂模式与在open Harmony连接模块中设计实现
一、总述(Introduction)
工厂模式(Factory Pattern)是软件工程中一种经典的创建型设计模式(Creational Design Pattern),它的核心思想是:将对象的创建过程封装起来,调用方无需关心具体实现细节,只需通过统一的接口获取所需对象。
在鸿蒙软总线(SoftBus)的连接模块中,工厂模式被广泛应用。软总线需要支持多种连接方式(蓝牙BR、低功耗蓝牙BLE、TCP、P2P等),通过工厂模式,系统能够以统一的方式管理这些差异巨大的连接技术,实现"一个接口,多种实现"的优雅设计。
二、工厂模式核心概念(Core Concepts of Factory Pattern)
2.1 什么是工厂模式?
工厂模式就像现实生活中的"工厂":
- 客户(Client):只需要告诉工厂"我要什么产品"
- 工厂(Factory):负责生产具体产品,客户不需要知道生产过程
- 产品(Product):工厂产出的具体对象
2.2 工厂模式的三种常见形式
| 类型 | 说明 | 适用场景 |
|---|---|---|
| 简单工厂(Simple Factory) | 一个工厂根据参数决定创建哪种产品 | 产品类型较少 |
| 工厂方法(Factory Method) | 每种产品对应一个具体工厂 | 产品类型较多,需要扩展 |
| 抽象工厂(Abstract Factory) | 工厂本身也是抽象的,可以创建产品族 | 需要创建一系列相关产品 |
三、软总线连接模块的工厂模式设计(Factory Pattern in SoftBus Connection Module)
3.1 整体架构概览(Architecture Overview)
软总线连接模块采用了**"接口定义 + 工厂注册 + 统一调度"**的工厂模式架构:

3.2 核心代码解析(Core Code Analysis)
3.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::function<std::shared_ptr<WifiDirectExecutor>(...)>;
// 创建执行器(Create Executor)
std::shared_ptr<WifiDirectExecutor> NewExecutor(...)
{
// 如果注册了自定义生成器,使用自定义逻辑
// If custom generator is registered, use custom logic
std::shared_ptr<WifiDirectExecutor> executor = (executorGenerator_ == nullptr) ?
std::make_shared<WifiDirectExecutor>(...) :
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 SoftBus)
6.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 Abstraction):
ConnectFuncInterface定义标准接口 - 灵活扩展(Flexible Extension):新增连接类型无需改动核心逻辑
- 透明调用(Transparent Invocation):调用方无需关心底层实现
- 资源管理(Resource Management):工厂统一管理对象生命周期
这种设计使得软总线能够优雅地支持多种连接技术,为鸿蒙系统的分布式能力提供了坚实的基础设施支撑。
更多推荐




所有评论(0)