Factory Constructor in Dart Docs [링크]

Use the factory keyword when implementing a constructor that doesn’t always create a new instance of its class. For example, a factory constructor might return an instance from a cache, or it might return an instance of a subtype. Another use case for factory constructors is initializing a final variable using logic that can’t be handled in the initializer list.

-> factory키워드는 클래스의 새로운 인스턴스를 항상 생성하지 않는 생성자를 실행할 때 사용하세요. 예를들면, factory 생성자는 캐시에서 인스턴스를 반환하거나, subtype의 인스턴스를 반환할 수 있습니다. factory 생성자의 다른 사용법은 initializer 리스트에서 처리할 수 없는 로직을 사용하여 final 변수를 초기화 하는 것입니다.

Singleton Pattern [링크]

In software engineering, the singleton pattern is a software design pattern that restricts the instantiation of a class to one “single” instance. This is useful when exactly one object is needed to coordinate actions across the system. The term comes from the mathematical concept of a singleton.

-> Software Engineering에서, 싱글톤 패턴은 클래스의 인스턴스화를 하나의 "단일" 인스턴스로 제한하는 소프트웨어 디자인 패턴입니다. 시스템 전체에서 작업을 조정하는데 정확히 하나의 object가 필요할 때 유용합니다. 이 용어는 싱글톤의 수학적 컨셉에서 비롯됩니다.

Singleton 클래스 형식

class Singleton{
  static final Singleton _instance = Singleton._internal();
  
  factory Singleton(){
    return _instance;
  }
  
  Singleton._internal(){ // 클래스가 최초 생성될 때, 1회 발생
    // 초기화 코드  
  }
}

Singleton Example

class Me{
  static final Me _instance = Me._internal();
  static final String _name = "ssorry_choi";
  
  factory Me(){
    return _instance;
  }
  
  static String get name => _name;
  
  Me._internal(){ // 클래스가 최초 생성될 때, 1회 발생
    // 초기화 코드  
  }
}

void main() {
  var jacob = Me();
  var choi = Me();
  
  if(jacob == choi){
    print('Same Person!');
  }else{
    print('Different Person!');
  }
}

result : 'Same Person!'

Singleton vs Class

class Singleton{
  static final Singleton _instance = Singleton._internal();
  int count=0;
  
  factory Singleton(){
    return _instance;
  }
  
  Singleton._internal(){
    //초기화 코드
    print('Created Singleton Class!');
    count = 0;
  }
}

class Normal{
  int count=0;
  Normal(){
    // 초기화 코드
    print('Created Normal Class!');
    count = 0;
  }
}

void main() {
  var normalOne = Normal(); //첫번째 일반 클래스 생성
  var normalTwo = Normal(); //두번째 일반 클래스 생성
  
  var singleOne = Singleton(); //첫번째 싱글톤 클래스 생성
  var singleTwo = Singleton(); //두번쨰 싱글톤 클래스 생성, But 이미 클래스가 생성되었기 때문에
                               //인스턴스만 넘겨주며, 초기화 코드가 실행되지 않는다.
  
  print('singleton One: ${singleOne.count}, Two : ${singleTwo.count}');
  print('normal One : ${normalOne.count}, Two : ${normalTwo.count}');
  
  //각 클래스의 count 값 1씩 증가
  normalOne.count++;
  normalTwo.count++;
  
  singleOne.count++;
  singleTwo.count++;
  
  
  print('\n\n===각 클래스 count값 1씩 증가 후===\n\n');
  print('singleton One: ${singleOne.count}, Two : ${singleTwo.count}');
  print('normal One : ${normalOne.count}, Two : ${normalTwo.count}');
  
}

Created Normal Class!
Created Normal Class!
Created Singleton Class!

singleton One: 0, Two : 0
normal One : 0, Two : 0

===각 클래스 count값 1씩 증가 후===

singleton One: 2, Two : 2
normal One : 1, Two : 1

일반 클래스는 2번 생성됐지만, Singleton 클래스는 한번만 초기화 코드가 돌아간 것을 볼 수 있다.

profile
Hello Universe!

0개의 댓글