factory 키워드는 클래스의 생성자가 매번 새로운 인스턴스를 생성하는 경우가 아닐 때 사용한다. 예를 들어 cache에서 기존 인스턴스를 리턴해주거나, 인스턴스의 subtype을 리턴해주는 경우이다. 또다른 사용법으로는 이니셜라이저에서 다룰 수 없는 final 변수의 초기값을 초기화(initalize)하기 위해 사용할 수 있다.
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);