1 factory工厂函数可以看作是构造函数的一种特殊形式
- 无法定义同名的构造函数和工厂函数
- 工厂必须有当前类return
class Cat {
// Cat() // 错误,不能同名
Cat.kitten () {print("i am a kitten");};
factory Cat () {
print("factory Cat");
return Cat.kitten();
}
}
void main () {
var c = Cat();
}
/*
输出结果:
factory Cat
i am a kitten
*/
- 命名构造函数也可以用factory
class Cat {
Cat.kitten() {
print("i am a kitten");
}
factory Cat.tom () {
print("factory Cat.tom");
return Cat.kitten();
}
}
void main() {
var c = Cat.tom();
}
/*
输出结果:
factory Cat.tom
i am a kitten
*/
2 工厂函数,经常被用来实现类的单例模式
class Cat {
static Cat? _instance; // ? 可空
Cat._single(); // 命名构造函数语法糖(无参罢了)
factory Cat () {
if (_instance == null) {
_instance = Cat._single();
}
return _instance!; // !非空断言
}
}
void main(List<String> args) {
var c1 = Cat();
var c2 = Cat();
print(c1 == c2);
}
/*
输出结果:true
*/
当然,也可以单独用一个命名构造函数作创建单例使用
class Cat {
static Cat? _instance; // ? 可空
Cat._single(); // 命名构造函数语法糖(无参罢了)
factory Cat.one () {
if (_instance == null) {
_instance = Cat._single();
}
return _instance!; // !非空断言
}
}