본문 바로가기

Design Patterns

Factory Method Pattern ① Simple Factory

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
책을 시작하면서 new에 대한 고찰이 나옵니다. 처음에 스트레티지 패턴을 배우면서 나왔던 디자인 원칙 중에 하나죠, 특정 구현보다는 인터페이스를 바탕으로 프로그래밍 한다는 원칙입니다. 하지만 new를 사용하는 것 자체가 결국은 특정 구현을 사용하는것이라는 내용입니다.

스타크래프트 좋아하시죠? 프로토스 유닛들 여러가지가 있습니다. 이걸 인퍼테이스 라고 합시다. 그러면 이 프로토스 유닛을 구현하는 구상 클래스들에는 질럿이나 드라군, 프로브, 캐리어 등등 뭐 여러가지가 있겠지요, 이렇게 구상 클래스들이 많은 경우에는 조건문을 사용해서, 특정 유닛을 생성해 줘야겠지요.

이 조건문을 사용한 부분을 변하는 부분이라고 할 수 있습니다. 특히나 객체 생성을 처리하는 클래스를 팩토리(Factory) 라고 부른다고 하는데요, 변하는 부분을 이 팩토리 클래스로 옮겨주면 변하는 부분을 따로 캡슐화 시킬 수가 있겠죠. 이런식으로 객체 생성의 경우 따로 변화하는 부분을 캡슐화 시켜주는것이 팩토리 메소드 패턴이냐???

아닙니다 -_- 한번에 끝날리 없죠... 일단 팩토리라고 부르는 경우가 세가지의 경우가 있다고 합니다. 이 세가지 경우 중 두가지는 팩토리를 잘못 사용하는 경우를 범하는 상황인데요. 방금 이야기한 객체를 생성하는 클래스를 지칭하는 팩토리, Factory Method Pattern을 가르키는 팩토리, Abstract Factory Pattern을 가르키는 팩토리. 이 세가지 개념에 대해서는 RTP를 통해서 다뤄보도록 하겠습니다 ^^

일단은 이런 간단한 팩토리를 한번 만들어봤습니다.

사용자 삽입 이미지

UnitMaker 클래스는 GatewayFactory를 사용하는 클라이언트 클래스입니다. GatewayFactory를 통해서 ProtossUnit 인스턴스를 받게 됩니다. Gateway에서는 프로토스 지상유닛들을 만들죠 -ㅅ-? 따라서 질럿, 드라군, 하이템플러, 다크템플러가 생산이 됩니다. makeSound() 메소드는 유닛 나올때 나오는 소리입니다 -_-;;

테스트를 해볼까용 -ㅅ-?

public class FactoryDemo {

      public static void main(String[] args) {

            GatewayFactory factory = new GatewayFactory();

            UnitMaker test = new UnitMaker(factory);

            test.orderUnit("zealot");

            test.orderUnit("dragoon");

      }

}

사용자 삽입 이미지

질럿 한마리와 드라군 한마리를 생성했습니다! 뿌듯합니다 ㅠㅠ