162 lines
4.1 KiB
Markdown
162 lines
4.1 KiB
Markdown
# Bricks 工厂模式技术文档
|
||
|
||
## 概述
|
||
|
||
`bricks.Factory` 是一个基于单例模式的工厂类,用于注册和获取组件(或“小部件”)对象。它提供了一个全局可访问的注册表,允许动态地注册命名的组件类或对象,并通过名称进行检索。
|
||
|
||
该实现是 `Bricks` 前端框架/库的一部分,旨在统一管理可复用的 UI 组件或其他功能模块。
|
||
|
||
---
|
||
|
||
## 代码结构
|
||
|
||
```javascript
|
||
var bricks = window.bricks || {};
|
||
class Factory_ {
|
||
constructor() {
|
||
this.widgets_kv = new Object();
|
||
this.widgets_kv['_t_'] = 1;
|
||
}
|
||
|
||
register(name, widget) {
|
||
this.widgets_kv[name] = widget;
|
||
}
|
||
|
||
get(name) {
|
||
if (this.widgets_kv.hasOwnProperty(name)) {
|
||
return this.widgets_kv[name];
|
||
}
|
||
return null;
|
||
}
|
||
}
|
||
bricks.Factory = new Factory_();
|
||
```
|
||
|
||
---
|
||
|
||
## 核心类:`Factory_`
|
||
|
||
### 构造函数 `constructor()`
|
||
|
||
初始化一个空的对象 `widgets_kv`,用于存储注册的组件。
|
||
|
||
#### 初始化内容:
|
||
- `this.widgets_kv = new Object()`
|
||
创建一个普通对象作为键值对存储容器。
|
||
- `this.widgets_kv['_t_'] = 1`
|
||
预留字段,可能用于调试、版本标识或检测对象是否已被初始化(用途未明确,但不影响主流程)。
|
||
|
||
> ⚠️ 注意:使用 `new Object()` 而非 `{}` 仅为风格选择,功能一致。
|
||
|
||
---
|
||
|
||
### 方法说明
|
||
|
||
#### `register(name: string, widget: any): void`
|
||
|
||
将指定名称与组件(类、函数或对象)注册到工厂中。
|
||
|
||
##### 参数:
|
||
| 参数名 | 类型 | 描述 |
|
||
|---------|--------|------|
|
||
| `name` | string | 注册的唯一名称(键),用于后续查找 |
|
||
| `widget`| any | 要注册的组件,通常为类构造函数或配置对象 |
|
||
|
||
##### 行为:
|
||
- 直接赋值:`this.widgets_kv[name] = widget`
|
||
- 若名称已存在,则覆盖旧值
|
||
|
||
##### 示例:
|
||
```js
|
||
class MyWidget { /* ... */ }
|
||
bricks.Factory.register('my-widget', MyWidget);
|
||
```
|
||
|
||
---
|
||
|
||
#### `get(name: string): any | null`
|
||
|
||
根据名称从工厂中获取已注册的组件。
|
||
|
||
##### 参数:
|
||
| 参数名 | 类型 | 描述 |
|
||
|---------|--------|------|
|
||
| `name` | string | 要查询的组件名称 |
|
||
|
||
##### 返回值:
|
||
- 如果存在该名称的组件,返回对应值;
|
||
- 否则返回 `null`
|
||
|
||
> 使用 `hasOwnProperty` 检查避免原型链污染风险。
|
||
|
||
##### 示例:
|
||
```js
|
||
const WidgetClass = bricks.Factory.get('my-widget');
|
||
if (WidgetClass) {
|
||
const instance = new WidgetClass();
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 全局实例:`bricks.Factory`
|
||
|
||
通过以下语句暴露为全局单例:
|
||
|
||
```js
|
||
bricks.Factory = new Factory_();
|
||
```
|
||
|
||
确保在整个应用中只有一个 `Factory` 实例,所有模块共享同一注册表。
|
||
|
||
> 利用 `window.bricks || {}` 确保命名空间安全,防止覆盖已有变量。
|
||
|
||
---
|
||
|
||
## 设计模式
|
||
|
||
- **单例模式(Singleton Pattern)**
|
||
`Factory_` 类仅被实例化一次,全局共享状态。
|
||
|
||
- **工厂模式(Factory Pattern)**
|
||
提供统一接口来创建对象,解耦对象的使用与创建过程。
|
||
|
||
---
|
||
|
||
## 使用场景
|
||
|
||
适用于需要动态加载或按需获取组件的系统,例如:
|
||
|
||
- UI 组件库注册与调用
|
||
- 插件系统
|
||
- 模块化前端架构中的依赖查找
|
||
|
||
---
|
||
|
||
## 注意事项
|
||
|
||
1. **名称冲突**
|
||
`register` 不检查重名,后注册者会覆盖前者,请确保命名唯一性。
|
||
|
||
2. **安全性**
|
||
当前未对输入参数做类型校验,建议在生产环境中添加防御性编程措施。
|
||
|
||
3. **性能**
|
||
使用普通对象作为 map,在现代 JS 引擎中对于中等规模键集表现良好。若需大规模注册,可考虑改用 `Map`。
|
||
|
||
4. **扩展建议**
|
||
- 可增加 `unregister(name)` 方法以支持注销组件
|
||
- 可增加 `list()` 方法返回所有注册项列表用于调试
|
||
|
||
---
|
||
|
||
## 版本信息
|
||
|
||
- 创建时间:未知(根据代码推断为早期 JS 模块化方案)
|
||
- 兼容性:支持 ES6+ 环境,可在浏览器中直接运行
|
||
|
||
---
|
||
|
||
## 总结
|
||
|
||
`bricks.Factory` 是一个轻量级、高效的组件注册与获取机制,适用于构建模块化、可扩展的前端系统。其简洁的设计使其易于理解和集成,是 `Bricks` 框架基础设施的重要组成部分。 |