一、factory描述

当使用factory修饰一个构造器时,DartVM不会总是创建一个新的对象,而是返回一个在内存中已经存在的对象。比如它可能会从缓存中返回一个已有的实例,或者是返回子类的实例。

二、使用场景

(1)避免创建过多的重复实例,如果已创建该实例,则从缓存中拿出来

实例:Language tour | Dart

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);}
}var logger = Logger('UI');
logger.log('Button clicked');
​
var logMap = {'name': 'UI'};
var loggerJson = Logger.fromJson(logMap);

(2)调用子类的构造函数(工厂模式 factory pattern)

abstract class Animal {String name;void getNoise();factory Animal(String type,String name) {switch(type) {case "cat":return new Cat(name);case "dog":return new Dog(name);default:throw "The '$type' is not an animal";}}
}
​
class Cat implements Animal {String name;Cat(this.name);@overridevoid getNoise() {print("${this.name}: mew~");}
}
​
class Dog implements Animal {String name;Dog(this.name);@overridevoid getNoise() {print("${this.name}: wang~");}
}
​
int main(){var cat = new Animal("cat","wiki");var dog = new Animal("dog","baobao");cat.getNoise();dog.getNoise();return  0;
}

(3)实现单例模式

class Singleton {static final Singleton _singleton = Singleton._internal();
​factory Singleton() {return _singleton;}Singleton._internal();
}
​
main() {var s1 = Singleton();var s2 = Singleton();print(identical(s1, s2));
}

Dart(13)-factory相关推荐

  1. 如何用Dart写一个单例

    由于Dart拥有factory constructors,因此构建单例模式很容易. class Singleton {static final Singleton _singleton = new S ...

  2. Flutter factory关键字

    在Flutter中好几次见到factory,以前不耽误我使用,也就没太关注,但是今天有看到了,所以就想知道他是干啥的. 我在百度中搜索"Flutter factory关键字",基本 ...

  3. 设计模式(八)Abstract Factory模式

    抽象工厂的工作是将"抽象零件"组装为"抽象产品".在抽象工厂模式中将会出现抽象工厂,它会将抽象零件组装为抽象产品.也就是说,我们并不关心零件的具体实现,而是只关 ...

  4. 十五天精通WCF——第七天 Close和Abort到底该怎么用才对得起观众

    原文:十五天精通WCF--第七天 Close和Abort到底该怎么用才对得起观众 一:文起缘由 写这一篇的目的源自于最近看同事在写wcf的时候,用特别感觉繁琐而且云里雾里的嵌套try catch来防止 ...

  5. ASP.NET设置ie打印两法[转载]

    在ASP.Net中最为头痛的可能就是打印设置了. 为了这个问题,我都要熬白头了.网上也找了很多代码,但是总是会存在一些问题.根据我自己的实际试验发现不能用,为找不到对象之类的错误提示. 这里给出两种实 ...

  6. 对页面制定区域进行打印,以及打印不显示页脚URL的方法

    第一种方式 - 此种方式简单易用,但不能进行页面设置,会在底部显示页面的URL地址. 打印命令:只需在页面上的按钮事件调用这段JS代码 javascript:window.print(); ===== ...

  7. ASP.NET设置ie打印两法 (精)(转)

    在ASP.Net中最为头痛的可能就是打印设置了. 为了这个问题,我都要熬白头了.网上也找了很多代码,但是总是会存在一些问题.根据我自己的实际试验发现不能用,为找不到对象之类的错误提示. 这里给出两种实 ...

  8. Spring 配置解析之Properties

    1.简单示例: SpringBoot中的的配置简单属性类支持ConfigurationProperties方式,看一个简单的示例. 1 @ConfigurationProperties(prefix ...

  9. 通向架构师的道路(第十二天)之Axis2 Web Service(三)

    一.SOAPIn Axis2 在前两天的教程中,我们学习到了用Axis2如何进行复杂数据.简单数据进行传输. 正如我在前一天教程中所说,在web service的世界里,一切都是基于SOAP的,因此在 ...

最新文章

  1. WTL 出现的SetMsgHandled和IsMsgHandled 错误
  2. LTE中的TB/codeword/layer/precoding/port
  3. TP6返回插入数据的自增ID
  4. 为什么你总是申请不到大额贷款?
  5. 算法 --- 二叉树查找树的先序(中序、后序)遍历的js实现
  6. matlab学习:图像频域分析之Gabor滤波
  7. c语言 define 关键字,c语言中define的一个不常见的用法
  8. 习题7.10 使用割线法求解方程
  9. iOS点击获取短信验证码按钮
  10. ibatis 直接升格为 apache 一级项目了
  11. 强化学习之DQN(附莫烦代码)
  12. 员工绩效评估的5个目标
  13. 丝滑流畅的手写签名 PC适配版
  14. 租用游艇,Clear And Present Danger S,Heat Wave G,单源最短路径(弱化版)
  15. oCPC实践录 | oCPC产品设计与出价原理(1)
  16. 中型B2C电商行业BI系统推荐?
  17. (三)jenkins+bonobo git server+windows系统自动化部署springboot项目(远程windows自动化部署)
  18. IPVS(也叫LVS)的源码分析之persistent参数
  19. 解决在启动VirtualBox虚拟机时出现“未能启动虚拟电脑Ubuntu,由于下述物理网卡未找到:”的错误
  20. 数据结构—图(Part Ⅱ)—最小生成树 最短路径

热门文章

  1. ubuntu 虚拟机安装Gtest
  2. Stackelberg博弈问题双层模型转化为MPEC模型的三种方法
  3. 大三学生考研VS就业,该如何选择
  4. 1.7-17:字符串判等
  5. FMpeg分析4:AVStream
  6. uncooked 计算机术语,物流专业英语和计算机基础练习题[].doc
  7. 图像特征点及特征描述子总结
  8. 新媒体专员必备素材网站,没有灵感,找它就对了!
  9. Python实现条形码生成
  10. 华测服务器进不去系统,华测云服务器如何登陆