likes
comments
collection
share

Flutter学习-05-dart语法学习之工厂构造和单例

作者站长头像
站长
· 阅读数 64
  • 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');
  }
}

我们定义一个类,我们私有属性不想暴漏的话,我们可以自定义一个行参,之后赋值给私有属性。我们也可以校验参数传递的正确性

Flutter学习-05-dart语法学习之工厂构造和单例 我们如果参数条件不满足的话就会报错

Flutter学习-05-dart语法学习之工厂构造和单例

转载自:https://juejin.cn/post/7026313845647867934
评论
请登录