Easy Understanding

웹 백엔드 관점으로 본 디자인 패턴 정리(5) - 각종 팩토리 패턴 비교(Factory, Abstract Factory Pattern) 본문

Study

웹 백엔드 관점으로 본 디자인 패턴 정리(5) - 각종 팩토리 패턴 비교(Factory, Abstract Factory Pattern)

appleg1226 2022. 5. 6. 12:42

- 필요 개념: 상속
- 활용도: 일반적으로 유용
- 난이도: 쉬움
- 패턴이 필요한 상황: 객체를 생성해야하는 모든 상황 

1. 정적 팩토리 메서드

이건 우리가 평소에 자주 쓰는 팩토리 패턴이다.

굉장히 보편적으로 사용되며 상속을 지원하는 클래스의 경우 자식 클래스도 반환해주기도 한다. 

public class UserFactory{
  public static User create(String type){
    if(type.equals("adult"){
      return new AdultUser(...);
    } else {
      return new YoungUser(...);
    }
  }
}

 

2. 팩토리 메서드 패턴

위의 패턴에서 상속이 복잡해서 if else를 이용한 분기처리가 많아진다면 여기로 와야 한다.

어느 도메인에서나 사용되는 아이템이라는 것을 예로 들어보자.

이번에는 게임 아이템으로 해보려고 한다.

아이템에는 여러 종류가 있다.

일단 무기와 방어구가 있다고 해보자.

그리고 무기와 방어구에는 또 많은 종류가 있기 때문에 상속이 복잡해진다.

interface Item { ... }
interface Weapon extends Item { ... }
interface Armor extends Item { ... }

class Sword implements Weapon { ... }
class Staff implements Weapon { ... }
class Bow implements Weapon { ... }

class Cap implements Armor { ... }
class Shirt implements Armor { ... }
class Shoes implements Armor { ... }

이걸 하나의 팩토리로 관리하기에는 확장성이 떨어지고 너무 코드가 뭉치게 된다.

 

이렇게 만들어서 

interface ItemFactory { ...}
class WeaponFactory implements ItemFactory { ... }
class ArmorFactory implements ItemFactory { ... }

 

이렇게 사용하면 된다.

ItemFactory weaponFactory = new WeaponFactory();
weaponFactory.create("short-sworld");
weaponFactory.create("long-bow");

이렇게 다수의 아이템처럼 복잡한 상속구조를 관리할 때는 팩토리 메서드 패턴을 사용하면 된다.

이렇게 복잡한 상속 구조를 생각보다 만날 일이 많을지는 잘 모르겠다.

 

3. 추상 팩토리 패턴

위는 상속에 따른 분기처리를 클래스로 나누는 방식이었다.

이 팩토리는 뭐랄까, 게임으로 치면 세트 아이템을 만들어주는 팩토리다. 

 

위에서는 하나의 클래스를 리턴해주는 팩토리였지만,

이번 팩토리는 내부 구성요소 여러 개를 담고 있는 팩토리다. 

 

게임을 예로 들면 다음의 아이템이 하나의 셋트라고 해보자.

모자, 갑옷, 장갑, 무기, 방패, 신발  

 

이런 구성의 셋트는 정말 많이 존재할 것이다.

'초보자 세트'

'나무 세트'

'강철 세트'

'금 세트'

'드래곤 세트'

등등 이런 세트 아이템을 만들어주는 팩토리가 필요할 수 있다.

 

구현은 간단하다.

interface SetItemFactory{
  Cap createCap();
  Armor createArmor();
  Gloves createGloves();
  Weapon createWeapon();
  Shield createShield();
  Shoes createShoes();
}

// 세부 구현 생략
class BeginnerSetFactory implements SetItemFactory { ... } 
class DragonSetFactory implements SetItemFactory { ... }

 

실제 구현에서도 게임과 개념은 비슷하다.

어떤 특정한 기능/UI 셋이나 모음을 이 추상 팩토리를 이용해서 제공해주면 된다.

 

간단하게 생각나는 예로는

v1 버전의 Util 클래스들의 모음과, v2 버전의 모음을 팩토리를 통해서 제공할 수도 있지 않을까 생각이 든다.

 

매우 복잡한 도메인이 아니라면 그렇게까지 많이 발생할만한 패턴은 아닐 것 같긴 하다.