1. 工厂构造函数:Dart中的设计哲学体现
第一次接触Dart的factory关键字时,我误以为它只是个语法糖。直到在真实项目中踩过几次坑,才真正理解这个设计背后的哲学思考。工厂构造函数不是简单的语法特性,而是Dart语言对对象创建过程赋予开发者控制权的关键设计。
想象你开了一家面包店。普通构造函数就像标准化的生产线,每次都会严格按照配方生产新面包。而工厂构造函数则是经验丰富的面包师傅,他会根据库存情况决定是烤新面包,还是直接给你昨天剩下的(当然没过期的那种)。这就是两者最本质的区别——是否强制创建新实例。
在Dart中,普通构造函数必须:
- 返回当前类的实例
- 初始化所有非空字段
- 不能有返回值声明
而工厂构造函数则打破了这些限制:
dart复制class Logger {
final String name;
static final Map<String, Logger> _cache = {};
// 工厂构造函数
factory Logger(String name) {
return _cache.putIfAbsent(name, () => Logger._internal(name));
}
// 普通构造函数
Logger._internal(this.name);
}
这个简单的日志器案例展示了工厂构造函数的三大优势:
- 实例复用:相同name的Logger只会创建一次
- 延迟初始化:只有首次使用时才创建实例
- 逻辑封装:创建过程对调用者完全透明
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 缓存复用:性能优化的利器
在Flutter项目中处理图片加载时,我深刻体会到缓存复用的价值。直接使用普通构造函数会导致大量重复的图片加载,内存瞬间爆炸。而采用工厂构造函数实现的ImageCache,则完美解决了这个问题。
让我们看一个增强版的图片缓存实现:
dart复制class CachedImage {
final String url;
static final LRUCache<String, CachedImage> _cache = LRUCache(maxSize: 100);
factory CachedImage(String url) {
