动态构建不规则数组的工厂模式是将按需生成不同结构多维数组的逻辑封装为可复用、参数驱动的创建机制,根据行数、每行长度等条件灵活产出结构各异的数组实例。

动态构建不规则数组的工厂模式,本质是把“按需生成不同结构二维(或多维)数组”的逻辑封装进一个可复用、参数驱动的创建机制中。它不追求统一维度,而是根据输入条件(如行数、每行长度、数据类型或业务规则)灵活产出结构各异的数组实例。
为什么需要工厂来处理不规则数组?
直接用嵌套循环硬编码容易导致:重复初始化逻辑、难以统一管理数据格式、新增结构时需修改多处、测试覆盖困难。工厂模式将“怎么构”和“构什么”分离,让调用方只关注意图(比如“我要一个三行、长度分别为2/5/1的整数数组”),而不关心具体实现细节。
核心实现方式(以Java为例)
使用@Factory注解配合参数化构造函数,是最贴近TestNG语境的动态方式;但通用场景下,更推荐普通工厂类封装:
-
定义抽象数组构建器:声明一个接口或基类,含
build()方法,返回Object[][]或泛型数组如T[][] -
按规则实现具体构建器:例如
FixedRowLengthBuilder、RandomLengthBuilder、PatternBasedBuilder,各自在build()中生成符合要求的不规则结构 -
工厂类统一调度:提供静态方法如
create(String type, Object... args),内部根据type选择对应构建器并传参调用 -
支持运行时配置:可从JSON、YAML或数据库读取结构描述(如
[{"row":0,"length":3},{"row":1,"length":7}]),交由工厂解析后构建
JavaScript中的轻量级实践
利用其动态特性,可直接用工厂函数完成:
function createJaggedArray(config) {
if (config.type === 'step') {
return Array.from({ length: config.rows }, (_, i) => Array(i + 1).fill(0));
}
if (config.type === 'random') {
return Array.from({ length: config.rows }, () =>
Array(Math.floor(Math.random() * 5) + 2).fill(null).map(() => Math.random())
);
}
throw new Error('Unknown array type');
}
<p>const arr1 = createJaggedArray({ type: 'step', rows: 4 }); // [[0], [0,0], [0,0,0], [0,0,0,0]]
const arr2 = createJaggedArray({ type: 'random', rows: 3 });
</p>
注意事项与边界处理
不规则数组虽灵活,但工厂需主动防御异常情况:
- 对空配置、负长度、超大尺寸做校验,避免内存溢出或无限循环
- 明确返回数组的元素类型是否统一(如全为Number),必要时加入类型断言或转换
- 若用于测试数据生成,建议配套提供
validate()方法,检查结构是否符合预期(如第i行长度是否等于指定值) - 避免在工厂内耦合业务逻辑——它只负责“搭架子”,填充数据应由外部注入或通过策略接口完成











