Abstract Factory Pattern
Abstract Factory Pattern
추상 팩토리 패턴
인터페이스를 이용하여, 서로 의존적이거나 연관된 객체를 일관되게 생성할 수 있다.
UML
1
Abstract Factory
Factory에 대한 공통 인터페이스 (추상체)
Concrete Factory 1, 2
실제 객체를 생성하는 구상된 클래스
Product A1, A2, B1, B2
팩토리를 통해 생성된 구체적인 객체
Abstract Product A, B
생성할 객체들에 대한 공통 인터페이스
Client
사용자
예제
GUI객체를 만드는 예제
버튼과 셋팅 두개의 기능을 제공한다고 가정.
각각 Abstract Product A, B 에 해당
//Click기능이 있는 버튼
public interface Button {
public void Click();
}
//Setting창을 열어주는 SettingView
public interface SettingView {
public void openSettingView();
}
각 OS별 객체 동작 구현(실제 방법 생략)
구체적인 객체 Product A1, A2, B1, B2 에 해당
public class MacButton implements Button {
@Override
public void Click() {
//MAC API
}
}
public class MacSettingView implements SettingView{
@Override
public void openSettingView() {
//MAC API
}
}
public class WindowsButton implements Button{
@Override
public void Click() {
//WIN32 ...
}
}
public class WindowsSetting implements SettingView{
@Override
public void openSettingView() {
//WIN32API
}
}
위의 객체들은 일관되게 생성되어야 한다.
이를 위한 팩토리 클래스 사용
추상체인 Abstract Factory 및
구상체 Concrete Factory 1, 2 에 해당
//Fatory 인터페이스
public interface GuiFactory {
public Button createButton();
public SettingView createSettingView();
}
//Mac 용 GUI객체를 생성하는 Factory 클래스
public class MacGuiFactory implements GuiFactory{
@Override
public Button createButton() {
// TODO Auto-generated method stub
return new MacButton();
}
@Override
public SettingView createSettingView() {
// TODO Auto-generated method stub
return new MacSettingView();
}
}
//Windows 용 GUI객체를 생성하는 Factory 클래스
public class WindowsGuiFactory implements GuiFactory{
@Override
public Button createButton() {
// TODO Auto-generated method stub
return new WindowsButton();
}
@Override
public SettingView createSettingView() {
// TODO Auto-generated method stub
return new WindowsSetting();
}
}
실제 이용시 일관된 OS에 맞는 객체를 생성할 수 있으며, OS 변경시 osName값만 변경해주면 된다.
public class Main {
public static void main(String arg[])
{
GuiFactory guiFactory = null;
String osName = "Win"; //enviroment.GetOsName();
if (osName.equalsIgnoreCase("win"))
{
guiFactory = new WindowsGuiFactory();
}
else if (osName.equalsIgnoreCase("Mac"))
{
guiFactory = new MacGuiFactory();
}
//...
Button btn = guiFactory.createButton();
SettingView setView = guiFactory.createSettingView();
btn.Click();
setView.openSettingView();
}
}
위 예제에서는 버튼과, 셋팅창 두개의 객체 만을 생성하지만 무수히 많은 종류의 객체가 필요한 경우 개발자의 실수를 야기할 가능성이 높다. 하지만 추상 팩토리 패턴을 적용함으로써 일관된 객체를 생성할 수 있다.