Rust Pattern Components
一个高质量的 Rust 设计模式组件库,提供构建器、工厂、观察者等常用设计模式的现代化实现。
特性
- 零成本抽象:利用 Rust 的类型系统和编译时优化
- 线程安全:所有组件都设计为线程安全,支持并发使用
- 弱引用管理:观察者模式使用弱引用避免循环引用和内存泄漏
- 编译时注册:工厂模式通过
inventorycrate 在编译时注册工厂 - 丰富的错误处理:完整的错误类型和回退策略
安装
[]
= "0.1"
如果还需要过程宏(#[simple_factory]、#[observable]),可以使用统一的 rust-patterns crate:
[]
= "0.1"
包含的设计模式
1. 构建器模式 (Builder)
通过 builder_helper! 宏为构建器类型添加条件设置方法 when_some,避免大量 if let Some(v) = x {} 样板代码。
功能特点
- 支持
Self(消费型)和&mut Self(可变引用型)两种方式 - 可为多个构建器类型一次性实现
- 类型安全的链式调用
- 当值为
None时自动跳过,不调用闭包
使用方式
use builder_helper;
// Self 版本(消费型构建器)
builder_helper!;
// &mut Self 版本(可变引用构建器)
builder_helper!;
// 同时为多个类型实现
builder_helper!;
示例
use builder_helper;
builder_helper!;
2. 工厂模式 (Factory)
类型安全的工厂系统,支持编译时工厂注册、多种回退策略和完整的错误处理。
核心组件
| 组件 | 说明 |
|---|---|
Factory<T> |
工厂 trait,定义 create 方法 |
SimpleFactory<T> |
工厂集合,按 ID 查找并创建对象 |
FactoryRegistry<T> |
工厂注册表,配合 inventory 在编译时注册工厂 |
FactoryFallback |
回退策略枚举(First / Last / NoFallback) |
FactoryError |
错误类型(FactoryNotFound / EmptyIdNoFallback / NoFactoriesAvailable) |
register_factory! |
注册工厂的宏 |
示例
use ;
// 定义产品 trait
// 产品实现 A
;
// 产品实现 B
;
// 编译时注册工厂
register_factory!;
register_factory!;
回退策略
| 策略 | 空 ID 时行为 |
|---|---|
First |
使用集合中的第一个工厂 |
Last |
使用集合中的最后一个工厂 |
NoFallback |
直接返回 EmptyIdNoFallback 错误 |
3. 观察者模式 (Observer)
线程安全的观察者模式实现,使用弱引用避免循环引用。
核心组件
| 组件 | 说明 |
|---|---|
Observer trait |
观察者接口,定义 update 方法 |
Observable trait |
被观察者接口,定义 attach / detach 方法 |
ObserverRegistry<T> |
观察者注册表,管理弱引用列表,提供 notify 和 notify_ignore_error 方法 |
设计特点
- 弱引用管理: 使用
Weak<dyn Observer>存储观察者,避免强引用循环 - 自动清理: 通知时自动跳过已释放的观察者
- 防止重复: 通过
Weak::ptr_eq检查防止重复添加 - 两种通知策略:
notify: 遇到错误立即停止通知,并返回错误notify_ignore_error: 忽略所有错误,继续通知所有观察者
示例
use Arc;
use ;
// 被观察者:温度传感器
// 观察者:温度显示器
;
过程宏(需 rust-patterns crate)
rust-pattern-macros 提供了两个过程宏,可通过 rust-patterns crate 统一使用。
#[simple_factory]
自动为 trait 生成工厂结构体和 create 方法:
use simple_factory;
// 宏会生成:
// pub struct MyTraitFactory;
// impl MyTraitFactory {
// pub fn create(id: &str, strategy: FactoryFallback)
// -> Result<(&str, Box<dyn MyTrait>), FactoryError>
// }
#[observable]
自动为结构体添加 ObserverRegistry 字段并实现 Observable trait:
use observable;
// 宏会添加 registry 字段,实现 Observable trait,
// 并提供 notify 和 notify_ignore_error 方法。
API 文档
完整的 API 文档可在 docs.rs 查看。
运行测试
# 运行所有测试
# 运行特定模块的测试
运行方式
此库提供 rust-pattern-components(核心组件)和 rust-patterns(组件 + 过程宏)两种使用方式。
建议在大多数情况下使用 rust-patterns,因为它同时提供了运行时代码和过程宏,使用更加统一方便。
许可证
本项目基于 MIT 许可证 - 查看 LICENSE 文件了解详情。
作者
- Linshan Yang - yanglsh@yeah.net
相关项目
- rust-design-patterns - Rust 设计模式集合
- inventory - 编译时注册系统
- thiserror - 错误处理库
提示: 本项目正在积极开发中,API 可能会发生变化。建议在生产环境中使用时锁定特定版本。