티스토리 뷰

Mobile/Dart

[Dart] factory

춘햄 2022. 6. 26. 10:59

Java는 싱글톤 패턴을 사용하기 위해 보통 getInstance() 메서드를 따로 구현한다. 

 

하지만, Dart는 이 싱글톤 패턴을 구현해주는 factory라는 키워드를 따로 가지고 있다.

 

Dart 공식 레퍼런스에서는 factory 키워드를 새로운 인스턴스를 생성하지 않는 생성자를 구현할 때 사용하라고 한다.

 

바로 한번 확인해보자.


factory 특징

 매번 인스턴스를 새로 생성하는 일반적인 constructor와 달리 factory 키워드에는 몇 가지 특징이 있다.

  • 기존에 이미 생성된 인스턴스가 있다면 return 하여 재사용한다.
  • 하나의 클래스에서 하나의 인스턴스만 생성한다(싱글톤 패턴).
  • 서브 클래스 인스턴스를 리턴할 때 사용할 수 있다.
  • Factory constructors 에서는 this 에 접근할 수 없다.

어렵게 생각하지 말고, 일단은 Java의 getInstance() 메서드를 재정의하여 사용한다는 개념으로 보면 쉬울 거 같다.

 

아래와 같이 Dog라는 Class가 있고, 이를 상속한 Labrador, Doberman 클래스가 있다. 

class Dog{
  String name;
  Dog(this.name);
}
class Labrador extends Dog{
  Labrador(String name):super(name);
}
class Doberman extends Dog{
  Doberman(String name):super(name);
}

조건문을 타고 상황에 따라 다른 인스턴스를 생성하고자 한다면, 

void main(List<String> arguments) {
  Dog dog;
  String name='tommy';
  bool isGuardian= false;
  if(isGuardian){
    dog = Doberman(name);
  }
  else{
    dog = Labrador(name);
  }
}

위와 같이 사용할 수 있을 것이다. 그러나, 해당 조건을 다른 메서드나 클래스에서도 사용하고자 한다면? 매번 조건문을 사용하여 인스턴스를 생성하는 것이 아닌 factory 키워드를 사용하여 메서드를 정의하면, 더 간결하게 처리할 수 있게 된다.

void main(List<String> arguments) {
  Dog myGaurdDog = Dog.createDog(name:"Rocky",gaurdDog:true);

  print(myGaurdDog.runtimeType);
}

class Dog{
  String name;
  Dog(this.name);

  factory Dog.createDog({required String name,bool gaurdDog=false}){
    if(gaurdDog){
      return Doberman(name);
    }
    else{
      return Labrador(name);
    }
  }
}

class Labrador extends Dog{
  Labrador(String name):super(name);
}
class Doberman extends Dog{
  Doberman(String name):super(name);
}

>> Doberman

'Mobile > Dart' 카테고리의 다른 글

[Dart] Null Safety  (0) 2022.06.27
[Dart] 비동기 프로그래밍: future, async, await  (0) 2022.06.27
[Dart] Extends, Implements, With  (0) 2022.06.26
[Dart] Dart 기본  (0) 2022.06.26
Comments