Landroid

[Creational Patterns] 추상 팩토리 (Abstract Factory) 본문

디자인 패턴

[Creational Patterns] 추상 팩토리 (Abstract Factory)

silso 2021. 3. 4. 15:16

추상 팩토리 패턴은 객체의 생성과 조합을 캡슐화하여 일관된 객체를 생성하고 프로그램 구조에 영향을 크게 받지 않는 패턴입니다.

 

추상 팩토리를 적용한 다이어그램

간단하게 Dart로 만든 클래스들을 가지고 설명하겠습니다.

참고로 scottt2.github.io/design-patterns-in-dart/ 에서 가져와서 수정한 코드입니다.

더보기

Dart를 선택한 이유

객체지향의 대표주자인 자바는 Dart와 문법적으로 그렇게 큰 차이는 없습니다.

있다면 자바의 interface와 다트의 mixin정도 있겠네요 ^^.

그리고 자바에 불필요하게 붙는 코드들로 인해 코드 보기 어려울 수 있다고 판단해서

Dart로 설명하려 합니다.

abstract class Edible {
  void grab();
}

class Chicken implements Edible {
  void grab() {
    print("I Love Chicken!!!!");
  }
}

class Cake implements Edible {
  void grab() {
    print("so Sweat!");
  }
}

-----------------------------------------------------------------------------------------------

abstract class Drinkable {
  void pour();
}

class Beer implements Drinkable {
  void pour() {
    print("Pouring a delicious beer!");
  }
}

class Coffee implements Drinkable {
  void pour() {
    print("Pouring a refreshing coffee!");
  }
}

-----------------------------------------------------------------------------------------------

abstract class  RestaurantFactory {
  Drinkable createDrink();
  Edible createSomethingToEat();
}

class Pub implements RestaurantFactory {
  Drinkable createDrink() {
    return Beer();
  }
  
  Edible createSomethingToEat() {
    return Chicken();
  }
}

class CoffeeShop implements RestaurantFactory {
  Drinkable createDrink() {
    return Coffee();
  }
  
  Edible createSomethingToEat() {
    return Cake();
  }
}

-----------------------------------------------------------------------------------------------

void main() {
  String mood = "sleepy";
  RestaurantFactory destination;

  switch(mood) {
    case "sleepy": destination = CoffeeShop(); break;
    case "done": destination = Pub(); break;
    default: print("I only have two moods...");
  }

  destination.createDrink().pour();
  destination.createSomethingToEat.grab();
}

 

추상 팩토리를 사용하는 이유는 

만약 Edible과 Drinkable을 메뉴별로 Factory 클래스로 만들면 연관성이 있는 클래스를 생성하기 어렵습니다.

대신 Pub이나 CoffeeShop 클래스와 같이 가게별로 Factory 클래스를 만들면 클래스를 연관성 있게 생성할 수 있습니다.

  • Pub: Chicken과 Beer객체를 생성하는 팩토리 클래스
  • CoffeeShop: Cake, Coffee 객체를 생성하는 팩토리 클래스

 

이렇게 여러 종류의 객체를 생성할 때 객체들 사이의 관련성이 있는 경우 라면 각 종류별로 별도의 Factory 클래스를 사용하는 것보단 관련 객체들을 일관성 있게 생성하는 Factory 클래스를 사용하는 것이 추상 팩토리 패턴의 핵심입니다.

Comments