개발공부/디자인패턴

팩토리 메서드 패턴 (Factory Method Pattern) 설명과 예제

개발자 찐빵이 2022. 1. 4. 06:50
728x90

"찐빵님, 지금 객체 생성 함수가 세 개 있잖아요, 그거 팩토리로 바꿔서 PR 해주세요"
??? 팩토리 패턴이 뭐지??? 팩토리 패턴이 뭔지 몰라서 공부해봤다.

팩토리 메서드 패턴

조건에 따라 객체를 다르게 생성해야 할 때, 조건문을 사용해서 분기 처리를 하는데,
분기에 따른 객체의 생성을 직접 하지 않고, 팩토리 클래스에 위임해서 그 안에서 객체를 생성하도록 하는 방식이다.

객체를 찍어내는 공장이기 때문에 "팩토리"라는 이름이 붙었나 보다.

팩토리를 왜 사용할까?

SNS 클래스를 만들고, 트위터, 페이스북, 인스타그램을 생성해봤다.

public abstract class SNS
{
}
public Twitter()
{
  Console.WriteLine("Twitter");
}
public Facebook()
{
  Console.WriteLine("Facebook");
}
public Instagram()
{
  Console.WriteLine("Instagram");
}

만약 내가 입력에 따른 다른 SNS를 생성하고 싶을 때, 아래처럼 분기 처리를 해서 해결할 수 있다.

switch (type)
{
  case "Twitter":
    return new Twitter();
    break;
  case "Facebook":
    return new Facebook();
    break;
  case "Instagram":
    return new Instagram();
    break;

  default:
    return null;
}

그런데 여러 위치에서 같은 일을 반복해야 한다면?

위 switch문이 여러 위치에 있게 되어 중복되는 코드가 발생하고 지저분해 보일 것이다.

만약 KakaoTalk이라는 SNS의 한 종류가 추가된다면 모든 switch문에서 KakaoTalk을 추가해줘야 하는 번거로움이 있다.
즉, 객체 간의 결합도가 강해지고 유지보수도 어려워진다.

이러한 이유로 팩토리 클래스를 만들어서 분기 처리를 한 곳에서만 할 수 있게 변경한다.

public class SNSFactory
{
  public SNS create(string type)
  {
    switch (type)
    {
      case "Twitter":
        return new Twitter();
        break;

      case "Facebook":
        return new Facebook();
        break;

      case "Instagram":
        return new Instagram();
        break;

      default:
        return null;
    }
  }
}

생성한 팩토리 클래스를 사용해서 SNS 객체를 만들어보자

static void Main(string[] args)
{
  var snsFactory = new SNSFactory();
  snsFactory.create("Facebook");
  snsFactory.create("Instagram");
}

Result

Facebook
Instagram

이제 분기에 따른 SNS 객체를 생성하는 코드는 SNSFactory 클래스에만 존재한다.
SNS 종류가 추가되어도 여기에서만 변경하면 된다.
다른 클래스에서는 Factory 객체를 만들고 create 함수를 불러주면 되니 깔끔해졌다.

반응형