Factory constructors는 인스턴스 캐싱, 각기 다른 클래스의 인스턴스 반환, 혹은 Singleton patterns 구현 등 인스턴스 생성시 더 많은 제어가 필요할 때 사용된다.

 

Key points about Factory constructors in Dart.

  1. 항상 새로운 instance를 만들지 않고 다른 class의 instances, 기존 instance, null을 반환할 수 있다.
  2. this를 사용할 수 없다.
  3. Named constructors를 사용하여 instance생성의 다양한 방법을 제공한다.
  4. 사용예 :
    • 객체 caching
    • 조건에 따른 cached instances 반환
    • parameters에 따른 subclass 반환 

 

1. Singleton pattern

class Singleton {
  static Singleton? _instance;

  // Private constructor
  Singleton._();

  // Factory constructor to implement singleton pattern
  factory Singleton.getInstance() {
    if (_instance == null) {
      _instance = Singleton._();
    }
    return _instance!;
  }
}

void main() {
  var singleton1 = Singleton.getInstance();
  var singleton2 = Singleton.getInstance();

  print(identical(singleton1, singleton2)); // Output: true (same instance)
}
true

 

2. Singleton pattern

class Database {
  static final Database _instance = Database._internal();
  
  Database._internal() {
    print("Called Constructors");
  }
  
  factory Database.instance() => _instance;
  
  info() {
    print(identityHashCode(_instance));
  }
}

void main() {
  Database d1 = Database.instance();
  d1.info();
  
  Database d2 = Database.instance();
  d2.info();
  
  Database d3 = Database.instance();
  d3.info();

  print("");
  print(identical(d1, d2));
  print(identical(d2, d3));
}
Called Constructors
974343521
974343521
974343521

true
true

 

 

https://dart.dev/language/constructors#factory-constructors