factory简介
在Dart中,factory关键字用于定义工厂构造函数。它与普通的构造函数有以下几个区别:
- factory构造函数的调用可以返回子类型或其它类型的实例。普通构造函数总是返回其包含的类型的实例。
- factory构造函数可以有返回值。普通构造函数的返回值永远是其包含的类型的实例。
- factory构造函数不需要初始化包含类型的所有字段。普通构造函数需要确保所有非空的字段都有值。
使用factory的好处
- 可以根据传入的参数返回其它类型的实例,增加灵活性。
- 不需要全部初始化包含类型的字段,可以决定返回的实例属性,增加灵活性。
- 可以有返回值,不仅限于返回包含类型的实例,增加灵活性。
一般来说,当你的构造函数不完全按照包含类型的定义来初始化实例时,或者可能返回其它类型的实例,那么应该把它定义为factory构造函数。
实例
这里有一个示例可以说明factory构造函数的用法:
class Image {
final String name;
Image(this.name);
}
class ImageCache {
static Map<String, Image> _cache = {};
factory ImageCache.fromName(String name) {
if (_cache.containsKey(name)) {
return _cache[name];
} else {
final image = Image(name);
_cache[name] = image;
return image;
}
}
}
这里我们有:
- Image 类表示一个图片,有name字段。
- ImageCache 类表示图片缓存,有一个_cache字段存储所有的图片。
- ImageCache有一个factory构造函数fromName,用来从图片name创建ImageCache。
那么这个构造函数的用法如下:
dart
var image1 = ImageCache.fromName(‘image1’);
var image2 = ImageCache.fromName(‘image2’);
var image3 = ImageCache.fromName(‘image1’);
第一次调用时,会创建一个Image(‘image1’)的实例,存入缓存,并返回。
第二次调用时,会再创建一个Image(‘image2’)的实例,存入缓存,并返回。
但是第三次调用时,会直接从缓存返回第一个Image(‘image1’)的实例。
所以这里使用factory构造函数有几个好处:
- 根据name的不同可以返回Image或ImageCache的实例,增加灵活性。
- 不必要每次调用都创建新的Image实例,可以重用缓存中的实例,优化性能。
- 有返回值Image或ImageCache的实例,而不仅限于ImageCache的实例。
这是一个典型的使用factory构造函数的例子,用来进行实例重用和灵活的返回值。