본문 바로가기

Language/Design Pattern

Factory Method 패턴과 Abstract Factory 패턴의 차이점

Factory Method & Abstract Factory 차이점


작성자 : 박민권

Factory Method 패턴과 Abstract Factory 패턴이 너무 비슷해 보여서 이 두 패턴의 차이점을 정의해봅니다.
두 패턴에 대한 자세한 내용은 이곳에 기술하지 않습니다.
디자인 패턴에 대해 궁금증을 갖고 이 글을 읽으시는 분이라면 상속, 다형성, abstract등 클래스에 대한 기본지식은 알고 있다는 가정하에 글을 작성했습니다.
이해하기 쉽도록 스타크래프트를 예로 설명하겠습니다.
틀린 부분이 있다면 지적 부탁드립니다.

Factory Method



abstract class 유닛{
    void 어택();
}

class 마린 : 유닛{
    void 어택(){총쏜다;}
}

class 매딕 : 유닛{
    void 어택(){치료한다;}
}

class 배럭{
    유닛 생성(종류){return (종류==MR) ? new 마린 : new 매딕;}
}



배럭(클래스)에서는 유닛(추상클래스)을 생성할 수 있습니다.
유닛을 상속받은 마린(클래스)과 매딕(클래스)이 있습니다.
배럭의 생성() 메소드에 인수로 무엇을 주느냐에 따라 마린 또는 매딕을 생성할 수 있습니다.

이런 복잡해 보이는 방식을 어디다가 쓰려고 만들었을까요?
아래와 같은 장점이 있기 때문입니다.


유닛 H;
H = 배럭.생성(MR); //마린생성
H.어택(); //총쏘기

H = 배럭.생성(MD); //매딕생성
H.어택(); //치료하기



배럭에서는 상황에 따라 마린 또는 매딕이 생성되지만 무엇이 생성되었는지는 알지 못해도 생성된 유닛을 사용하는데는 문제가 없습니다.
이렇듯 Factory에서 생성된 객체를 사용자는 종류에 신경쓰지 않고 생성된 객체를 똑같이 사용할 수 있습니다.

Abstract Factory



abstract class 유닛{
    void 어택();
}

class 마린 : 유닛{
    void 어택(){총쏜다;}
}

class 매딕 : 유닛{
    void 어택(){치료한다;}
}

class 배틀크루저 : 유닛{
    void 어택(){레이저;}
}

class 레이스 : 유닛{
    void 어택(){미사일;}
}

abstract class 생산공장{
    유닛 생산();
}

class 배럭 : 생산공장{
    유닛 생성(종류){return (종류==MR) ? new 마린 : new 매딕;}
}

class 스타포트 : 생산공장{
    유닛 생성(종류){return (종류==BC) ? new 배틀크루저 : new 레이스;}
}



제가 찾아본 Abstract Factory 패턴에 대한 예제는 가상공장에서 가상제품1과 가상제품2를 생산하는 메소드가 나뉘어져 있는데 그 부분이 중요한 것이 아니라는 판단이 들어 제 나름대로 예제를 작성해 봤습니다.

Abstract Factory 패턴에 대한 장점은 Factory Method 패턴에 대한 장점의 확장이라 할 수 있겠습니다.
위 클래스를 이용한 예제는 아래와 같습니다.


생산공장 F;
유닛 H;

F = new 배럭();
H = F.생성(MR); //마린생성
H.어택(); //총쏘기

F = new 스타포트();
H = F.생성(BC); //배틀크루저생성
H.어택(); //레이저



* 마음대로 퍼가셔도 되지만 출처를 남겨주세요.(요즘 워낙 불펌이 많아서요.)

김재호// 추가 설명 감사합니다.
이 패턴을 설명하는 다른 사이트의 설명과 맞추어 설명하기 위해 H = F.생성(MR); 식으로 생성했으며 아래 댓글로 달린 김재호님의 추가 설명도 같이 참고하시기 바랍니다.