[Design Pattern] Factory Method Pattern(팩토리 메소드 패턴)


팩토리 메서드 패턴은 객체를 만들어 내는 부분을 서브 클래스에게 위임하는 패턴입니다. 즉, new 키워드를 호출하는 부분을 서브 클래스에게 위임하는 것이죠. 


이 패턴을 사용하는 이유는 어떤 상황에 따라서 생성해야하는 객체들이 다를 때, 그 객체를 생성하는 객체와 생성되는 객체 간의 결합도를 낮추어 코드를 유연하게 하기 위해 만들어진 것입니다. 


역시 말이 어려울 때는 예로들어 설명하는 것이 가장 좋습니다. Game CD를 판매하는 GameStore라는 클래스가 있다고 합시다.

 

public class GameCDStore {
CD cd;

public CD orderCD(String type){
if(type.equals("diablo")) cd = new DiabloCD();
else if(type.equals("starcraft")) cd = new StarCraftCD();
else if(type.equals("skyrim")) cd = new SkyrimCD();
}

CD getCD() { return cd; }
...

단순히 게임CD를 주문하는 메소드를 구현한 클래스죠. 그리고 위에서 보면 GameCDStore에 new 키워드가 눈에 띄게 많다는 것을 볼 수 있습니다. new 키워드는 어떤 블로거 분께서 설명해 주셨던 걸 기억하고 있는데 'new == 종속관계'라 보시면 됩니다. 정리하면,

클래스 안에 new 키워드가 있을 시 new 키워드를 통해 그 객체를 만든 객체와 만들어진 객체 사이는 종속 관계가 성립된다.

라고 간단하게 염두해 두시면 됩니다.


그리고 위 코드와 같은 처리는 큰 문제점을 내포하고 있습니다. GameCDStore를 만들어서 다 똑같이 운영하면 좋을테지만 NewYorkCDStore 혹은 KoreaCDStore에서 저 코드를 사용하는 것은 어불성설일 것입니다. 왜냐면 뉴욕에서나 한국에서 게임CD파는 종류가 다른 데 저 코드를 적용했다가는 큰일이 벌어지고 말 것이기 때문입니다.  그렇다면 기껏 짠 GameCDStore 코드를 재사용하지도 못하고 하나하나 다 바꿔줘야하는 극혐인 상황이 벌어진다는 것이죠. new 키워드를 통한 종속 관계가 생겼고, 그 덕분에 코드가 유연하지 못하게 되었기 때문입니다.


이때는 디자인 패턴의 원칙

바뀔 수 있는 부분을 찾아내서 바뀌지 않는 부분하고 분리시켜야 한다

는 원칙을 적용하여 코드를 수정해 보도록 하겠습니다.

public abstract class GameCDStore {
CD cd;

abstract CD orderCD(String type);

CD getCD(){ return cd; }
...
}
종속 관계가 발생하는 원인이었던 orderCD 메소드를 추상 메소드로 바꿔 줍니다. 그리고 orderCD의 구현 부분은 NewYorkCDStore, KoreaCDStore같은 GameCDStore을 상속받은 서브 클래스들이 작성하여 코드의 유연성을 확보합니다.

 

public class NewYorkCDStore extends GameCDStore {
@Override
CD orderCD(String type){
switch(type){
case "LOL" : return new LOLCD();
case "Uncharted" : return new UnchartedCD();
}
}

public class KoreaCDStore extends GameCDStore {
@Override
CD orderCD(String type){
switch(type){
case "Starcraft" : return new StarCraftCD();
case "DeadSpace" : return new DeadSpaceCD();
}
}
}


이를 통해, 구상 클래스에 대한 의존성을 줄이고 코드의 유연성을 확보하게 되었습니다. 그리고 이런 내용을 정리해 놓은 객체지향 디자인 원칙이 바로 의존성 역전 원칙(Dependency Inversion Principle)입니다.

추상화된 것에 의존하도록 만들어라. 구상 클래스에 의존하도록 만들지 않도록 한다.


왜냐하면


GameCDStore -> KoreaCDStore

GameCDStore -> NewYorkCDStore


에서 개선되어,


GameCDStore -> CD

CD <- KoreaCDStore

CD <- NewYorkCDStore


로 의존관계가 뒤집혔기 때문입니다.





이 글을 공유하기

댓글(0)

Designed by JB FACTORY