Dart 中 factory 用法
Use the factory keyword when implementing a constructor that doesn’t always create a new instance of its class. For example, a factory constructor might return an instance from a cache, or it might return an instance of a subtype.
当你使用factory关键词时,你能控制在使用构造函数时,并不总是创建一个新的该类的对象,比如它可能会从缓存中返回一个已有的实例,或者是返回子类的实例。
- 与构造函数的差别
构造函数不能有返回值,而factory必须有
- 3个使用场景
-
避免创建过多的重复实例,如果已创建该实例,则从缓存中拿出来。
-
调用子类的构造函数(工厂模式 factory pattern)
-
实现单例模式
-
//避免创建过多的重复实例,如果已创建该实例,则从缓存中拿出来。
class Logger {
static final Map<String, Logger> _cache = <String, Logger>{};
final String name;
factory Logger(String name) {
return _cache.putIfAbsent(name, () => Logger._internal(name));
}
Logger._internal(this.name){
print("创建了新的对象");
}
void log(String msg) {
print(msg);
}
}
var logger = Logger("aa");
var logger2 = Logger("aa");
//这两对象是同一个
//调用子类的构造函数(工厂模式 factory pattern)
abstract class Phone {
late String name;
factory Phone(String type, String name) {
if (type == "android") {
return AndroidPhone.internal(name);
} else {
return ApplePhone.internal(name);
}
}
static final Map<String, Phone> _map= {};
}
class AndroidPhone implements Phone {
@override
String name;
AndroidPhone.internal(this.name){
print("创建了 $name");
}
}
class ApplePhone implements Phone {
@override
String name;
ApplePhone.internal(this.name){
print("创建了 $name");
}
}
//调用
Phone p = Phone("android", "android");
Phone p2 = Phone("ios", "ios");
Phone p3 = Phone("android", "android");
print(identical(p, p3));
// 打印
2023-03-14 03:35:47.247 3779-3916 flutter com.example.untitled I 创建了 android
2023-03-14 03:35:47.247 3779-3916 flutter com.example.untitled I 创建了 ios
2023-03-14 03:35:47.248 3779-3916 flutter com.example.untitled I 创建了 android
2023-03-14 03:35:47.248 3779-3916 flutter com.example.untitled I false
//都是新的对象
- 改造 上面的 Phone 类
abstract class Phone {
static final Map<String, Phone> _map= {};
late String name;
factory Phone(String type, String name) {
if (type == "android") {
return _map.putIfAbsent(type, () => AndroidPhone.internal(name));
} else {
return _map.putIfAbsent(type, () => ApplePhone.internal(name));
}
}
}
//打印
2023-03-14 03:40:01.503 3779-3916 flutter com.example.untitled I 创建了 android
2023-03-14 03:40:01.504 3779-3916 flutter com.example.untitled I 创建了 ios
2023-03-14 03:40:01.504 3779-3916 flutter com.example.untitled I true
//两对象是同一个
//单例
class Singleton {
static final Singleton _singleton = Singleton._internal();
Singleton._internal() {
print("创建了Singleton新的对象");
}
factory Singleton() {
return _singleton;
}
}