【Flutter】dart构造函数、工厂构造函数

时间:2024-01-21 20:01:22

在OOP中,我们会使用类来定义一类对象的属性,和行为。通过调用该类的构造函数来创建类的实例对象。在通过调用方法来实现操作行为。

1、构造函数

和大多数OOP语言一样,dart的构造函数,采用和类同名的函数名作为构造函数,不显示声明构造函数会自动创建无参构造,构造函数不会被继承。此处不在赘述。关于dart特有的 命名构造函数稍微说明一下。

1.1 命名构造函数

开发中,我们通常会MapJson互转的场景,关于构造函数我们使用下面例子

import 'dart:convert';

class Token {
  final String token_type;
  final int expires_in;
  final String access_token;
  // final String? refresh_token;

  Token.fromJson(Map<String, dynamic> json)
      : token_type = json['token_type'],
        expires_in = json['expires_in'],
        access_token = json['access_token']
  // refresh_token = json.containsKey('refresh_token') ? json['refresh_token'] as String : ''
  ;

  Map<String, dynamic> toJson() => {
        'token_type': token_type,
        'expires_in': expires_in,
        'access_token': access_token,
        // 'refresh_token': refresh_token,
      };
}

2 factory constructor

2.1 官方文档

使用factory 修饰构造函数的时候,并不总是创建该类的实例对象。构造函数会从缓存返回一个实例。

2.1 官方例子

class Logger {
  final String name;
  bool mute = false;

  // _cache is library-private, thanks to
  // the _ in front of its name.
  static final Map<String, Logger> _cache = <String, Logger>{};

  factory Logger(String name) {
    return _cache.putIfAbsent(name, () => Logger._internal(name));
  }

  factory Logger.fromJson(Map<String, Object> json) {
    return Logger(json['name'].toString());
  }

  Logger._internal(this.name);

  void log(String msg) {
    if (!mute) print(msg);
  }
}
  • 定义了个Map用于cachelogger 实例对象。
  • 该类主要用于打印包含字符和Map(包含name属性的Map)log信息。
  • name字符变量改变也会创建新的Logger对象
  • 打印只包含name的map对象,真的是妙啊!!!!!!!!

2.3 jeverson 关于工厂构造的理解

  • factory 构造函数即为设计模式中的工厂模式
  • factory 构造函数创建的实例和单例差不多
2.3.1 关于Logger的改造
class Logger {
  factory Logger.create(ELogType type) {
    if (type == ELogType.info) {
      return Logger._infoLog();
    }
    if (type == ELogType.error) {
      return Logger._errorLog();
    }
    if (type == ELogType.warning) {
      return Logger._warningLog();
    }
    return Logger._infoLog();
  }

  Logger._infoLog() : displayColor = ELogType.info.logColor;
  Logger._errorLog() : displayColor = ELogType.error.logColor;
  Logger._warningLog() : displayColor = ELogType.warning.logColor;

  String displayColor;
}

enum ELogType {
  info(color: "white"),
  warning(color: "yellow"),
  error(color: "red");

  const ELogType({required this.color});

  final String color;

  String get logColor => color;
}

  • 基于简单工厂实现的一个Logger案例,当然现实中的Logger 在info,error,warning 的细数逻辑,并不是简单的赋值。
  • 关于抽象工厂的实现方式,本例不展开扩展,改造近提供设计的思路。

2.3.2 关于工厂构造在Flutter 的使用场景

  • 基础框架中的,日志收集以及需要采用单例模式
  • C端差异化源组件设计化的差异,Alert,Toast,HUD等
  • 通用业务的抽离。

TODO: 关于业务场景的实例拓展,