본문 바로가기

Coding Note

[Design pattern] Factory Method

Factory method pattern : 객체의 생성작업을 하나의 함수에게 전가하여 생성작업과 사용작업을 분리시켜준다. 생성작업의 구현은 생성함수를 가지는 클래스를 상속하여 재정의하는 방법으로 이루어진다.

 

 

 

객체를 생성하는 부분의 인터페이스만을 제공해주는 방법이기 때문에 은닉과 캡슐화가 잘 녹아있고 코드를 유연하게해주는 식초같은 패턴이다. 이 패턴은 생성되는 객체들이 하나의 슈퍼클래스로부터 파생된 클래스일때 사용되며 구체적인 객체의 생성은 Factory클래스를 파생하여 재정의한다. 


먼저 설명한 Abstract factory pattern은 Factory method를 포함한다고 볼 수 있다. Abstract factory pattern의 중점은 Factory 클래스가 Abstract로구현되여 갈아낄 수 있다는점이다.


Factory method는 클래스 내부에서 사용하지만, public으로두어 외부에 공개해도 된다.


Factory에서는 객체가 실행시간에 동적으로 생성되는 만큼 가비지 컬렉터가 없다면 메모리 해제에 많은 신경을 써야한다. Factory뿐만의 문제가 아니다. c++에서 디자인패턴을 적용한다면 메모리 해제가 디자인을 고려하는데에 드는 노력보다 더 클때가 있다.

 

건담 프라모델이 생성되는 과정을 통해서 패턴을 설명해 보았다.


/* Gundam.java */

public abstract class Gundam {

protected Equipment mainEquipment;


public void prepareEquipment(){

mainEquipment = createEquipment();

}


public abstract Equipment createEquipment();


public Equipment getMainEquipment(){ return mainEquipment; }

public void setMainEquipment(Equipment equipment){ mainEquipment = equipment; }

}


/* CrossBoneGundam.java */

public class CrossBoneGundam extends Gundam {

@Override

public Equipment createEquipment() {

Equipment equipment = new Saber();

//장비를 점검합니다..

return equipment;

}

}


/* Equipment.java */

public interface Equipment {

public void use();

}


/* Saber.java */

public class Saber implements Equipment {

@Override

public void use() {

System.out.println("Hack the enemy");

}

}


/* main */

public static void main(String[] args){

Gundam crossbone = new CrossBoneGundam();

crossbone.prepareEquipment();


crossbone.getMainEquipment().use();

}



건담의 종류는 무수히 많고 착용하는 장비도 제각각이다. 제각각인 장비는 또 어떻게만들어지는지 생성해주는 루틴마다 코드가 달라진다면 얼마나 무서운일이 일어날지 상상도못하겠다.


Gundam클래스는 단지 무기를 만든다라는 createEquipment 함수를 인터페이스로써 제공하며 prepareEquipment에서는 이 인터페이스를 통해 무기를 생성하여 장착한다.  물론 어떤무기가되었건 장착하는 과정은 변함이없다.

건담중 하나인 크로스본 건담은 주 무기로 세이버를 가진다. 무기를 생성하는 과정을 재정의하여 자신의 세이버를 만들어 주었다.


좀더 좋은 세이버가 제작되어 생성되는 과정이 복잡해진다 해도 장비를 준비하는입장에선 변할게 없다는것을 알수있다.


다른 건담이 와서 크로스본의 세이버를 탐낸다면 기분좋게 하나 더 만들어주자.


Gundam otherGundam = new OtherGundam();

otherGundam.setMainEquipment( crossbone.createEquipment() );


이래선 안되는 상황이라면 Factory method의 접근지정자를 입맛에 맞게 변경해주면 된다.


한줄요약 : 유명한 맛집에선 음식제조를 공개하지않는법

'Coding Note' 카테고리의 다른 글

[Design pattern] Builder  (0) 2013.01.31
[Design pattern] Singleton  (0) 2013.01.31
[Design pattern] Abstract Factory  (0) 2013.01.27
[Design pattern] Observer  (4) 2013.01.22
[Design pattern] Strategy  (0) 2013.01.19