티스토리 뷰

Abstract Factory Pattern (추상 팩토리 패턴)

비행기를 조정하고 미사일을 발사해서 적을 미사일로 맞추는 슈팅 게임을 만든다고 가정하자.
게임 플레이를 진행하는 Stage 클래스는 몇 단계인지에 따라 서로 다른 적, 장애물, 보스를 생성해야 한다.

이를 위한 Stage 클래스는 다음과 같다.

이 코드의 문제점은 단계별로 적, 장애물, 보스를 생성하는 규칙이 Stage 클래스에 포함되어 있다는 것이다.
새로운 적 class가 추가되거나, 각 단계의 보스 종류가 바뀔 때, 단계별 적 생성 규칙이 달라질 경우 등에
Stage 클래스를 함께 수정해야하고, 코드또한 복잡해진다.

따라서 Stage 클래스에서 객체생성 책임을 분리한다.**​** 이때 사용되는 패턴이 추상 팩토리 패턴이다.

EnemyFactory는 Boss, SmallFlight, Obstacle 객체를 생성하는 메소드를 정의한다.
EnemyFactory.getFactory()는 static 메소드로 전달받은 파라미터에 따라 알맞은 EnemyFactory 객체를 리턴한다.

팩토리인 EnemyFactory를 구현한 Concrete 팩토리 클래스는 위와 같이 알맞은 객체를 생성한다.

이렇게 팩토리 구조를 가지면 Stage 클래스를 다음과 같이 사용할 수 있다.

이제 Stage 클래스는 객체 생성이 필요한 경우,
직접 생성하지 않고 추상팩토리타입인 EnemyFactory를 이용해서 생성한다.

Stage는 더이상 StrongAttackBoss, DashSmallFlight 클래스같은 Concrete 제품 클래스를 사용하지 않는다.
이들을 사용해 객체를 생성하는 코드는 EnemyFactory의 하위인 EasyStageEnemyFactory, HardEnemyFactory로 옮겨졌다.

따라서 이제 레벨1의 적 객체를 변경하고 싶다면, Stage클래스를 건드리지않고 EnemyFactory의 리턴부만 수정해주면 된다.

한편으로, EnemyFactory 객체를 구하는 기능을 EnemyFactory 클래스가 아닌
DI(Dependency Injection)를 이용해 생성자나 set메소드로 전달받는 방식도 있다.
이를 통해, EnemyFactory 추상 클래스를 인터페이스로 전환할수도 있다.

추상 팩토리 패턴의 장점은
클라이언트에 영향을 주지 않으면서 사용하는 객체를 변경할 수 있다는 점이다.


내 코드에서의 적용

좀더 간단히 접근하면 다음과 같은 팩토리 메소드와 팩토리 클래스를 예시로 들 수 있다.

Factory Method

(클래스 내부에서 자기 자신을 생성하는 static 메소드)
1주차 - 2장 객체 생성과 파괴 - 재성 - SLiPP 스터디 - SLiPP::위키

Factory Class

(간단한 형태의 팩토리 클래스)

참고자료


정적 팩토리 메서드(static factory method)
정적 팩토리 메소드와는 다른 개념이다. 구분하자.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함