一、总述(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);
}

关键流程

  1. 参数校验(Parameter Validation)
  2. 类型检查(Type Checking)
  3. 从工厂获取对应管理器(Get Manager from Factory)
  4. 调用具体实现(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 等)时:

  1. 实现 ConnectFuncInterface 接口
  2. 在 ConnectType 枚举中添加新类型
  3. 编写初始化函数并注册到 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):工厂统一管理对象生命周期

这种设计使得软总线能够优雅地支持多种连接技术,为鸿蒙系统的分布式能力提供了坚实的基础设施支撑。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐