Flutter学习-05-dart语法学习之工厂构造和单例
- dart的工厂构造和单列以及初始化列表
1.dart的工厂构造和单例
factory
的官方描述:当你使用factory关键词时,你能控制在使用构造函数时,并不总是创建一个新的该类的对象,比如它可能会从缓存中返回一个已有的实例,或者是返回子类的实例。
值得注意的是:构造函数不能有返回值,而factory必须有
class FactoryModel{
String? name;
int? height;
FactoryModel(this.name, this.height);
}
FactoryModel factory01 = FactoryModel('factory',1);
FactoryModel factory02 = FactoryModel('factory', 1);
print(factory01 == factory02);
定义一个factoryModel
类,初始化相同的属性值,它们不相等。很明显我们类似我们iOS中2个对象的指针指向的地址不同
。那么我们怎么构建一个单列模式
呢。
1.1 单例模式实现
class FactoryModel{
static FactoryModel? _shareInstance;//单例
String? name;
int? height;
FactoryModel(this.name, this.height);
factory FactoryModel.shareInstance(){
if(_shareInstance == null)
{
_shareInstance = FactoryModel._init();
}
return _shareInstance!;//强解包
}
FactoryModel._init();//私有初始化
}
FactoryModel factory03 = FactoryModel.shareInstance();
FactoryModel factory04 = FactoryModel.shareInstance();
print(identical(factory03, factory04));
identical等同于==
,好处是如果重写了==
,那用identical
会更方便。
factory FactoryModel.shareInstance() => _shareInstance ??= FactoryModel._init();
我们也可以优化下,直接用箭头符号和判断符??=
直接完成。
1.2 调用子类的构造函数(工厂模式 factory pattern)
A factory constructor can check if it has a prepared reusable instance in an internal cache and return this instance or otherwise create a new one. 避免创建过多的重复实例,如果已创建该实例,则从缓存中拿出来。
class Logger{
final String name;
static final Map<String,Logger> _cache = <String,Logger>{};//根据name缓存实例对象
factory Logger(String name){
return _cache.putIfAbsent(name, () => Logger._init(name));
//putIfAbsent 相当于从内存中根据【key】获取,如果存在找个对象就直接返回,不存在走后面的初始化代码,并根据找个key存储找个对象。
}
Logger._init(this.name);
}
putIfAbsent
相当于从内存中根据【key
】获取,如果存在找个对象就直接返回,不存在走后面的初始化代码,并根据找个key
存储找个对象。
Logger log1 = Logger("name");
Logger log2 = Logger('name');
Logger log3 = Logger('22');
print(identical(log3, log2));//false
print(identical(log1, log2));//true
官方的例子:factory例子
2. 初始化列表
初始化列表的目的:给final
变量赋值,校验
传递参数的正确性。
class person {
final String _name;//私有属性
int age;
num height;
person(String name,this.age,this.height):_name = name,assert (age>0),assert(height>180){
print('name:$_name\nage::$age,\nnum:$height');
}
void printAction(){
print('name:$_name\nage::$age,\nnum:$height');
}
}
我们定义一个类,我们私有属性不想暴漏的话,我们可以自定义一个行参,之后赋值给私有属性
。我们也可以校验参数传递的正确性
我们如果参数条件不满足的话就会
报错
转载自:https://juejin.cn/post/7026313845647867934