객체를 생성하기 위한 기능을 정의하지만 서브클래스에서 연결할 객체를 결정하도록 책임을 분리한 디자인 패턴입니다.
객체와 객체 간의 관련성을 유지한 상태로 객체 내의 동작을 다르게 정의하여 새로운 서비스를 개발하기 위해서 사용합니다. 이 내용은 추상 팩토리 패턴과 유사하기 때문에 UML, 구현 이후 둘의 차이점을 마지막에 정리해보겠습니다.
PC(Desktop), 모바일(Mobile)의 멀티 플랫폼에서 각각 버튼을 만들고 클릭하기 위한 UML을 그려봤습니다.
추상 클래스, 인터페이스 모두 상속받을 클래스에게 구현 명세를 전달하기 때문에 MyDialog, Button 클래스를 추상 클래스로 구현했습니다.(추상 팩토리 패턴과 동일)
//Main
public class Main {
public static void main(String[] args) {
MyDialog myDialog = new MobileDialog();
myDialog.startClick();
}
}
//Button
public abstract class Button {
abstract void onClick();
}
//DesktopButton
public class DesktopButton extends Button {
@Override
public void onClick() {
System.out.println("PC 버튼 클릭!");
}
}
//MobileButton
public class MobileButton extends Button {
@Override
public void onClick() {
System.out.println("모바일 버튼 클릭!");
}
}
//MyDialog
public abstract class MyDialog {
public void startClick()
{
Button button = createButton();
button.onClick();
}
abstract Button createButton();
}
//DesktopDialog
public class DesktopDialog extends MyDialog {
@Override
public Button createButton() {
return new DesktopButton();
}
}
//MobileDialog
public class MobileDialog extends MyDialog {
@Override
public Button createButton() {
return new MobileButton();
}
}
Main에서 구현과 팩토리 클래스와 연결을 담당하게 됩니다. 팩토리 클래스의 역할은 다른 클래스들과의 연결을 담당합니다.
Main은 팩토리 클래스와 연결을 담당하게 됩니다. 팩토리 클래스에서는 구현을 담당하고 팩토리 클래스를 상속받은 서브 클래스에서 실제로 사용하는 클래스와의 연결을 담당합니다.