- Factory Method 의 좀더 큰 버젼이다.
- 비슷한 유형의 product 를 하나로 묶어 이것을 interface 로 만들고,
- 2개 이상의 interface 를 다시 묶어 interface 로 만든다
- Factory Method 의 아이디어와 방식이 비슷한데, creator 가 product 의 abstract type 을 리턴 한다는 것이다.
- 아래 예시를 보면, button, checkbox 각각 Mac, Window 버젼이 있다.
- 그리고 이 두 UI 를 abstract 로 묶은 GUIFactory 도 각각 Mac, Window 버젼이 있다.
- 프로그램 시작시 state 를 구분해서 Mac, 혹은 Window 버젼의 GUIFactory 를 생성한다.
- 장단점은 factory method 와 같다.
public interface Button {
void paint();
}
public class MacOSButton implements Button {
@Override
public void paint() {
// implement
}
}
public class WindowsButton implements Button {
@Override
public void paint() {
// implement
}
}
public interface Checkbox {
void paint();
}
public class MacOSCheckbox implements Checkbox {
@Override
public void paint() {
// implement
}
}
public class WindowsCheckbox implements Checkbox {
@Override
public void paint() {
// implement
}
}
public interface GUIFactory {
Button createButton();
Checkbox createCheckbox();
}
public class MacOSFactory implements GUIFactory {
@Override
public Button createButton() {
return new MacOSButton();
}
@Override
public Checkbox createCheckbox() {
return new MacOSCheckbox();
}
}
public class WindowsFactory implements GUIFactory {
@Override
public Button createButton() {
return new WindowsButton();
}
@Override
public Checkbox createCheckbox() {
return new WindowsCheckbox();
}
}
public class Application {
private Button button;
private Checkbox checkbox;
public Application(GUIFactory factory) {
button = factory.createButton();
checkbox = factory.createCheckbox();
}
public void paint() {
button.paint();
checkbox.paint();
}
}
public class Demo {
private static Application configureApplication() {
Application app;
GUIFactory factory;
String osName = System.getProperty("os.name").toLowerCase();
if (osName.contains("mac")) {
factory = new MacOSFactory();
app = new Application(factory);
} else {
factory = new WindowsFactory();
app = new Application(factory);
}
return app;
}
public static void main(String[] args) {
Application app = configureApplication();
app.paint();
}
}
Comments
Post a Comment