위키에 나온 소스를 많이들 참고하더라 나도 그걸로 배워보는 중이다.
이번에는 추상 팩토리 패턴이라고 하여, 인터페이스를 두 개를 사용해서 첫번째 인터페이스를 구현한 클래스의 리턴이 두 번째 인터페이스 타입이므로 그로부터 호출되는 메소드는 두 번째 인터페이스를 구현한 또 다른 클래스가 된다.
1. 기본이 되는 인터페이스를 작성한다. 주의깊게 볼 것은 리턴타입이 또 다른 인터페이스 타입이라는 것이다.
public interface IFactory {
public IButton createButton();
}
2. 두 번째 인터페이스를 작성한다. 실제로 호출할 메소드 이름을 정의한다.
public interface IButton {
public void paint();
}
3. 1번 인터페이스를 구현한다. 역시나 1번 인터페이스의 리턴 타입에 맞춰 IButton 타입의 객체를 반환한다.
public class WinFactory implements IFactory {
@Override
public IButton createButton() {
return new WinButton();
}
}
public class OSXFactory implements IFactory {
@Override
public IButton createButton() {
return new OSXButton();
}
}
4. 3번에서 반환한 객체는 IButton 인터페이스를 구현해야 하며, 실제 동작을 구현한다.
public class WinButton implements IButton {
@Override
public void paint() {
System.out.println("WinButton");
}
}
public class OSXButton implements IButton {
@Override
public void paint() {
System.out.println("OSXButton");
}
}
5. Application 클래스를 작성한다. 제일 처음 구현된 IFactory 타입을 받아 (IButton) 인터페이스로 캐스팅해서 button에 넣는다. 이 button을 통해 실제 담긴 객체의 paint() 메소드를 호출한다.
public class Application {
public Application(IFactory factory) {
IButton button = factory.createButton();
button.paint();
}
}
6. 이제 테스트 클래스를 작성해 보자.
public class ApplicationRunner {
public static void main(String[] args) {
new Application(createOsSpecificFactory());
}
public static IFactory createOsSpecificFactory() {
int sys = 1;
if (sys == 0) {
return new WinFactory();
} else {
return new OSXFactory();
}
}
}
결과:
OSXButton (sys = 1 인 경우)
WinButton (sys = 0 인 경우)
@@ 복잡하다.
댓글 영역