Dart中的factory关键字用法

简介: Dart中的factory关键字用法

factory简介

在Dart中,factory关键字用于定义工厂构造函数。它与普通的构造函数有以下几个区别:


factory构造函数的调用可以返回子类型或其它类型的实例。普通构造函数总是返回其包含的类型的实例。

factory构造函数可以有返回值。普通构造函数的返回值永远是其包含的类型的实例。

factory构造函数不需要初始化包含类型的所有字段。普通构造函数需要确保所有非空的字段都有值。

使用factory的好处

1.可以根据传入的参数返回其它类型的实例,增加灵活性。

2.不需要全部初始化包含类型的字段,可以决定返回的实例属性,增加灵活性。

3.可以有返回值,不仅限于返回包含类型的实例,增加灵活性。

一般来说,当你的构造函数不完全按照包含类型的定义来初始化实例时,或者可能返回其它类型的实例,那么应该把它定义为factory构造函数。

实例

这里有一个示例可以说明factory构造函数的用法:


class Image {
  final String name;
  Image(this.name);
}
class ImageCache {
  static Map<String, Image> _cache = {};
  factory ImageCache.fromName(String name) {
    if (_cache.containsKey(name)) {
      return _cache[name];
    } else {
      final image = Image(name);
      _cache[name] = image;
      return image;
    }
  }
}

这里我们有:


Image 类表示一个图片,有name字段。

ImageCache 类表示图片缓存,有一个_cache字段存储所有的图片。

ImageCache有一个factory构造函数fromName,用来从图片name创建ImageCache。

那么这个构造函数的用法如下:

dart

var image1 = ImageCache.fromName(‘image1’);

var image2 = ImageCache.fromName(‘image2’);

var image3 = ImageCache.fromName(‘image1’);

第一次调用时,会创建一个Image(‘image1’)的实例,存入缓存,并返回。

第二次调用时,会再创建一个Image(‘image2’)的实例,存入缓存,并返回。

但是第三次调用时,会直接从缓存返回第一个Image(‘image1’)的实例。

所以这里使用factory构造函数有几个好处:

1.根据name的不同可以返回Image或ImageCache的实例,增加灵活性。

2.不必要每次调用都创建新的Image实例,可以重用缓存中的实例,优化性能。

3.有返回值Image或ImageCache的实例,而不仅限于ImageCache的实例。

这是一个典型的使用factory构造函数的例子,用来进行实例重用和灵活的返回值。

d38f41d7a3f10a1e242936dcf63a8067.png



相关文章
|
存储 设计模式 Dart
Flutter笔记:getX库中的GetView中间件
Flutter笔记:getX库中的GetView中间件
592 0
|
存储 数据库 索引
Flutter笔记:滚动之-无限滚动与动态加载的实现(GetX简单状态管理版)
本文介绍Flutter中如何实无线滚动(基于GetX简单状态管理而非有状态组件)
282 0
|
Dart IDE 开发工具
Flutter Version Manager (FVM): Flutter的版本管理终极指南
Flutter Version Manager (FVM): Flutter的版本管理终极指南
4885 1
|
7月前
|
安全 Ubuntu 网络安全
宝塔面板升级python3
Python 是一种广泛使用的高级编程语言,因其简洁的语法和丰富的库而受到开发者的喜爱。在许多Web应用程序和后端开发环境中,Python已成为重要工具。使用宝塔面板时,保持Python更新至关重要。本文介绍如何在服务器上安全升级Python:从环境准备、检查当前版本、安装工具包、下载并编译新版本、配置环境变量到测试新版本,确保升级顺利进行。建议定期更新以利用新特性和性能改进,并备份数据以防万一。
313 6
|
11月前
|
搜索推荐 数据挖掘 API
API接口在电商的应用及收益
本文探讨了API接口技术在电商领域的应用及其带来的收益。API接口作为连接电商平台与外部系统的桥梁,实现了高效、实时的数据交换和集成,提升了用户体验、运营效率和市场竞争力。具体应用包括库存管理、支付网关、物流跟踪、自动化业务流程、个性化推荐和精准营销等方面。通过实战案例分析,展示了亚马逊和小型电商公司如何利用API接口实现自动化管理,提高了工作效率和客户满意度。未来,API接口技术将更加注重智能化、标准化、安全性和跨界合作。
424 3
|
Linux 持续交付 开发工具
版本控制系统的选择:Git vs. Mercurial
【6月更文挑战第20天】Git vs. Mercurial: 两者都是流行的DVCS,Git由Linus Torvalds创建,以其速度和复杂分支管理著称,适合大型项目和有经验的开发者。Mercurial,由Matt Mackall开发,以其简洁命令行和易用性吸引初学者。Git社区更大,扩展更丰富,而Mercurial在某些场景下可能更直观。选择取决于项目需求、团队经验和偏好。
|
Kubernetes 监控 负载均衡
Istio:微服务开发的终极利器,你还在为繁琐的通信和部署流程烦恼吗?
本文介绍了服务网格(Service Mesh)的概念及其在微服务架构中的重要性。微服务强调围绕业务构建团队和去中心化的数据管理,带来更高的灵活性和扩展性。然而,随着服务数量增加,网络通信成为挑战,包括服务发现、路由和安全等问题。 Service Mesh如Istio应运而生,通过边车代理解决服务间通信,提供服务发现、负载均衡、智能路由、安全和监控等功能。它与Kubernetes结合,增强了容器环境的服务管理能力。Istio的bookinfo示例展示了其在多语言微服务中的应用,简化了代码中的服务调用逻辑,使开发更专注于业务本身。
1068 3
Istio:微服务开发的终极利器,你还在为繁琐的通信和部署流程烦恼吗?
|
设计模式 开发者 UED
Flutter笔记:DefaultTextStyle和DefaultTextHeightBehavior解读
Flutter笔记:DefaultTextStyle和DefaultTextHeightBehavior解读
255 0
|
Dart 监控 开发者
详细介绍Flutter Profiler的功能、使用方法以及如何利用它来提升应用的性能
【6月更文挑战第11天】Flutter Profiler是用于优化Flutter应用的关键工具,提供CPU、GPU、内存和网络分析。它帮助开发者监控运行时性能,识别瓶颈,如CPU过度使用、渲染问题、内存泄漏和网络效率低。通过选择分析类型、开始分析、查看结果,开发者可进行针对性优化。最佳实践包括定期分析、结合实际场景、关注关键指标及结合其他工具。有效利用Profiler能提升应用性能和用户体验。
493 2
|
存储 消息中间件 运维
单体应用与微服务的优缺点
单体应用(monolith application)就是将应用程序的所有功能都打包成一个独立的单元,可以是 JAR、WAR、EAR 或其它归档格式。
516 0