[Java]추상 팩토리(Abstract Factory) 패턴

엄진환·2021년 8월 5일
1
post-thumbnail

목적

객체를 생성하기 위해서 사용하는 디자인 패턴입니다.

사용하는 이유(동기)

제가 이해한 점은 하나의 객체를 다양한 방식으로 만들 때 각각 만드는 방식에 따라서 기능을 독립시켜서 구현하기 위해서 사용하는 패턴입니다. 예를 들면 멀티 플랫폼으로 모바일과 PC에서 모두 배포하고 싶은 서비스가 있을 때 각각의 공통 기능에 대하여 별도로 구현이 필요할 때 사용하는 패턴입니다.

UML

PC(Desktop), 모바일(Mobile)의 멀티 플랫폼에서 각각 버튼을 만들고 클릭하기 위한 UML을 그려봤습니다.

예제 코드

추상 클래스, 인터페이스 모두 상속받을 클래스에게 구현 명세를 전달하기 때문에 MyDialog, Button 클래스를 추상 클래스로 구현했습니다.

메인 클래스

//Main
public class Main {
    public static void main(String[] args) {
        MyDialog myDialog = new MobileDialog();
        Button button = myDialog.createButton();
//        MyDialog myDialog = new DesktopDialog();
//        Button button = myDialog.createButton();
        button.onClick();
    }
}

버튼 관련 클래스

//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("모바일 버튼 클릭!");
    }
}

플랫폼 관련 클래스(Dialog)

//MyDialog
public abstract class MyDialog {
    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();
    }
}

패턴의 장/단점(느낀점!)

장점

  1. 예제에서 Button을 보면 Main에서 button의 onClick하는 사용자는 button의 세부 구현을 신경쓰지 않고 사용할 수 있습니다.
  2. Main 클래스를 보면 new 연산자로 DesktopDialog, MobileDialog를 변경만 하면 플랫폼 변환이 가능하기 때문에 변환이 쉽습니다.
  3. 각 플랫폼 별로 공통 기능 위주로 구현하여 일관성이 높아집니다. 쉽게 말해서 PC, Mobile에 필요한 기능이 같으면 설계할 때 편리합니다.

단점

  1. 장점의 3번과 겹치는 부분인데 "새로운 플랫폼이 Button을 아예 다른 구조로 사용한다", "새로운 플랫폼은 아예 공통되지 않는 새로운 기능들만 쓴다" 이런 상황에서 각 플랫폼 별로 기능이 달라지면서 관리하기가 힘들어 질 것 같습니다.(다른 패턴이 보완해줄 문제인지 공부하면서 알게되면 링크로 남기겠습니다.)
profile
개발 공부 블로그

0개의 댓글