Dart(13)-factory
一、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相关推荐
- 如何用Dart写一个单例
由于Dart拥有factory constructors,因此构建单例模式很容易. class Singleton {static final Singleton _singleton = new S ...
- Flutter factory关键字
在Flutter中好几次见到factory,以前不耽误我使用,也就没太关注,但是今天有看到了,所以就想知道他是干啥的. 我在百度中搜索"Flutter factory关键字",基本 ...
- 设计模式(八)Abstract Factory模式
抽象工厂的工作是将"抽象零件"组装为"抽象产品".在抽象工厂模式中将会出现抽象工厂,它会将抽象零件组装为抽象产品.也就是说,我们并不关心零件的具体实现,而是只关 ...
- 十五天精通WCF——第七天 Close和Abort到底该怎么用才对得起观众
原文:十五天精通WCF--第七天 Close和Abort到底该怎么用才对得起观众 一:文起缘由 写这一篇的目的源自于最近看同事在写wcf的时候,用特别感觉繁琐而且云里雾里的嵌套try catch来防止 ...
- ASP.NET设置ie打印两法[转载]
在ASP.Net中最为头痛的可能就是打印设置了. 为了这个问题,我都要熬白头了.网上也找了很多代码,但是总是会存在一些问题.根据我自己的实际试验发现不能用,为找不到对象之类的错误提示. 这里给出两种实 ...
- 对页面制定区域进行打印,以及打印不显示页脚URL的方法
第一种方式 - 此种方式简单易用,但不能进行页面设置,会在底部显示页面的URL地址. 打印命令:只需在页面上的按钮事件调用这段JS代码 javascript:window.print(); ===== ...
- ASP.NET设置ie打印两法 (精)(转)
在ASP.Net中最为头痛的可能就是打印设置了. 为了这个问题,我都要熬白头了.网上也找了很多代码,但是总是会存在一些问题.根据我自己的实际试验发现不能用,为找不到对象之类的错误提示. 这里给出两种实 ...
- Spring 配置解析之Properties
1.简单示例: SpringBoot中的的配置简单属性类支持ConfigurationProperties方式,看一个简单的示例. 1 @ConfigurationProperties(prefix ...
- 通向架构师的道路(第十二天)之Axis2 Web Service(三)
一.SOAPIn Axis2 在前两天的教程中,我们学习到了用Axis2如何进行复杂数据.简单数据进行传输. 正如我在前一天教程中所说,在web service的世界里,一切都是基于SOAP的,因此在 ...
最新文章
- WTL 出现的SetMsgHandled和IsMsgHandled 错误
- LTE中的TB/codeword/layer/precoding/port
- TP6返回插入数据的自增ID
- 为什么你总是申请不到大额贷款?
- 算法 --- 二叉树查找树的先序(中序、后序)遍历的js实现
- matlab学习:图像频域分析之Gabor滤波
- c语言 define 关键字,c语言中define的一个不常见的用法
- 习题7.10 使用割线法求解方程
- iOS点击获取短信验证码按钮
- ibatis 直接升格为 apache 一级项目了
- 强化学习之DQN(附莫烦代码)
- 员工绩效评估的5个目标
- 丝滑流畅的手写签名 PC适配版
- 租用游艇,Clear And Present Danger S,Heat Wave G,单源最短路径(弱化版)
- oCPC实践录 | oCPC产品设计与出价原理(1)
- 中型B2C电商行业BI系统推荐?
- (三)jenkins+bonobo git server+windows系统自动化部署springboot项目(远程windows自动化部署)
- IPVS(也叫LVS)的源码分析之persistent参数
- 解决在启动VirtualBox虚拟机时出现“未能启动虚拟电脑Ubuntu,由于下述物理网卡未找到:”的错误
- 数据结构—图(Part Ⅱ)—最小生成树 最短路径