Factory Method Pattern
객체를 생성하기 위한 new 키워드를 호출하는 부분을 하위 클래스에 위임하는 패턴이다.
Factory(공장)에서만 객체를 생성하여, 하위 클래스에서 어떤 클래스를 생성할지 결정한다.
문제 코드
1 2 3 4 5 6 7 8 9 | CardGame cardgame = null; if (type == "Poker") { cardgame = new PokerGame(); } else if (type == "BlackJack") { cardgame = new BlackJackGame(); } | cs |
카드게임에 대한 코드가 있다. 입력에 따라 다른 카드게임을 구현한다.
위의 방법으로 구현하게 될 때 변경이나 확장할 요소가 생기면, 카드게임과 관련된 PokerGame(), BlackJackGame() 메서드를 매번 수정해야 하는 문제가 발생한다.
이런 문제를 방지하기 위해 팩토리 메서드 패턴을 사용하여
직접 객체를 생성해 사용하는 것을 방지하고
클래스간 결합도(클래스의 변경이 발생했을 때 다른 클래스에 얼마나 영향을 주는지)를 낮춰
유연성과 확장성 등의 유지보수에 용이하도록 한다.
팩토리 메서드 패턴을 적용한 코드
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 32 33 34 35 | // 카드게임 추상 클래스 public abstract class CardGame { public abstract String getName(); } // 포커게임 구현 클래스 public class PokerGame extends CardGame { @Override public String getName() { return "PokerGame"; } } // 카드게임 팩토리 클래스 public class CardGameFactory { public static CardGame createCardGame(String type) { if (type == "Poker") { return new PokerGame(); } else if (type == "BlackJack") { return new BlackJackGame(); } return null; } } // 메인 public class Main { public static public void main(String[] args){ CardGameFactory factory = new CardGameFactory(); CardGame cardGame1 = factory.createCardGame("Poker"); CardGame cardGame2 = factory.createCardGame("BlackJack"); System.out.println(cardGame1.getName()); // PokerGame System.out.println(cardGame2.getName()); // BlackJackGame } | cs |
new는 CardGameFactory 클래스 안에서만 사용되며, createCardGame 메서드를 통해 생성된 객체를 가져온다.
객체 생성에 대해서는 한 곳(팩토리)에서만 관리하게 된다.
또한 main에는 new 키워드를 사용하여 객체를 생성하지 않아, 어떤 객체가 생성되었는지 신경 쓸 필요없이 반환된 객체만 사용한다.
CardGame 클래스에서 변경이 발생해도 main에서 변경되는 것을 최소화할 수 있다.
또한 카드게임의 동일한 기능은 유지하면서, 나누어진 여러 종류의 카드게임에 대한 고유한 기능을 정의할 수 있다.
참고 출처
디자인패턴: 팩토리패턴(FACTORY PATTERN) - http://friday.fun25.co.kr/blog/?p=280
팩토리 메소드 패턴(Factory Method Pattern) - http://mygumi.tistory.com/264
'Design Pattern' 카테고리의 다른 글
Singleton pattern (싱글턴 패턴) (0) | 2018.07.20 |
---|