Dart / factory pattern

Restl2seung·2022년 5월 23일
0
post-custom-banner

factory란?

Use the factory keyword when implementing a constructor that doesn’t always create a new instance of its class

dart에서 설명하는 factory에 대한 설명이다.
항상 클래스의 새 인스턴스를 만들지 않는 생성자를 구현할 때 factory 키워드 사용 이라는 뜻이다.

핵심은 불필요한 인스턴스 중복 생성 없이 효율적으로 class의 기능을 사용할때 사용된다.

factory를 왜 사용하는가?

factory를 사용하면 여러 이점이있다.

  1. 인스턴스가 이미 생성된 상태라면 따로 생성하지 않고 재사용한다.
  2. 비즈니스 로직을 구현에서 분리하여 비즈니스 로직에 집중할 수 있다.
  3. 서브 클래스가 변경이 되더라도 집중된 비즈니스 로직만 변경해주면 되기 때문에 확장성이 뛰어나다.

구현 코드

factory pattern을 사용한 코드와 사용하지 않은 코드를 함께 구현한 핫도그 시즈닝 코드이다.

사용자가 선택한 시즈닝을 뿌린 핫도그를 제공하는 서비스 이다.

이 코드의 핵심은 HotDog class 와 FactoryHotDog class의 차이는 비즈니스 로직 유무와 factory 사용 유무이다.

main 코드는 HotDog class를 사용했을 때와 FactoryHotDog class를 사용했을 때를 나누었다.

HotDog class를 사용했을 때를 보면 HotDog를 따로 생성 그리고 비즈니스 로직을 작성하여 사용한다.

위와 같이 구현하게되면 main이 아닌 다른 파일에서 같은 기능을 구현할 때 새로운 인스턴스와 비즈니스 로직을 구현해야한다.

하지만 FactoryHotDog class를 사용하면 인스턴스를 따로 생성하지 않는다. 그리고 FactoryHotDog class 내에 구현된 비즈니스 로직을 호출하여 사용하기 때문에 더욱 효율적으로 코드 관리가 가능하다.

핫도그 시즈닝 종류.

enum HotDogSeasoning { Onion, Garlic, Pepper }

핫도그 추상 클래스.

abstract class HotDog {
  String getSeasoning();
}

Factory 를 사용한 핫도그 추상 클래스.

abstract class FactoryHotDog {
  String getSeasoning();
  
  factory FactoryHotDog.hotDogFactory(HotDogSeasoning order) {
    switch (order) {
      case HotDogSeasoning.Garlic:
        return GarlicHotDog();
        break;
      case HotDogSeasoning.Onion:
        return OnionHotDog();
        break;
      case HotDogSeasoning.Pepper:
        return PepperHotDog();
        break;
      default:
        return PepperHotDog();
    }
  }
}

각 시즈닝 종류에 따른 핫도그 클래스.

class OnionHotDog implements HotDog, FactoryHotDog {
  String seasoning = 'onion';

  @override
  String getSeasoning() => seasoning;
}

class GarlicHotDog implements HotDog, FactoryHotDog {
  String seasoning = 'garlic';

  @override
  String getSeasoning() => seasoning;
}

class PepperHotDog implements HotDog, FactoryHotDog {
  String seasoning = 'pepper';

  @override
  String getSeasoning() => seasoning;
}

main.

void main() {
  
  
  var order = HotDogSeasoning.Garlic;
  
  
  // factory를 사용하지 않았을때.
  HotDog? orderHotdog;
  switch (order) {
    case HotDogSeasoning.Garlic:
      orderHotdog = GarlicHotDog();
      break;
    case HotDogSeasoning.Onion:
      orderHotdog = OnionHotDog();
      break;
    case HotDogSeasoning.Pepper:
      orderHotdog = PepperHotDog();
      break;
    default:
  }
  if (orderHotdog != null) {
    print(orderHotdog.getSeasoning()); // garlic
  }
  
  
  // factory를 사용했을때.
  print(FactoryHotDog.hotDogFactory(order).getSeasoning()); // onion
}

factory를 추상적인 개념이 강하기에 직접 구현해보면 이해하기가 더욱 편한것 같다.

post-custom-banner

0개의 댓글