추상 팩토리 패턴(Abstract Factory Pattern)

wannabeking·2022년 10월 9일
0

디자인 패턴

목록 보기
6/14
post-thumbnail

팩토리 메소드 패턴과 차이점

팩토리 메소드 패턴은 추상 생산 클래스가 선언한 팩토리 메소드를 구상 클래스에서 구현하여 생성할 제품을 정했다.
또한 하나의 제품만 생성 가능했다.

추상 팩토리 패턴은 제품군을 생성하는 인터페이스를 제공하여 코드와 여러 제품들을 생산하는 팩토리를 분리할 수 있다.
만약 다른 제품을 생성하고 싶으면 추상 팩토리를 구현한 새로운 팩토리를 추가하여 사용하면 된다.



추상 팩토리

나는 개발자 중에서도 Spring을 다루는(언어 : Java, 직무 : Backend) 개발자를 희망한다.

Django를 다루는 개발자도 있을 것이다.

그렇다면, 추상 팩토리로 개발자를 찍어내어 취업시켜보자.


public class Java implements Language {

    public Java() {
        System.out.println("Java 공부 중...");
    }
}
public class Python implements Language {

    public Python() {
        System.out.println("Python 공부 중...");
    }
}
public class Backend implements Field {

    public Backend() {
        System.out.println("백엔드 프레임워크 공부 중...");
    }
}

언어로는 Java, Python
직무로는 Backend를 구현했다.


public interface DeveloperFactory {

    Language createLanguage();

    Field createField();
}
public class MeDeveloperFactory implements DeveloperFactory {

    @Override
    public Language createLanguage() {
        return new Java();
    }

    @Override
    public Field createField() {
        return new Backend();
    }
}
public class DjangoDeveloperFactory implements DeveloperFactory {

    @Override
    public Language createLanguage() {
        return new Python();
    }

    @Override
    public Field createField() {
        return new Backend();
    }
}

DeveloperFactory는 개발자의 구성요소(제품)들을 찍어낼 수 있게 정의한 추상 팩토리다.

나(Spring)라는 개발자를 찍어낼 수 있는 MeDeveloperFactory와 장고 개발자를 찍어낼 수 있는 DjangoDeveloperFactory를 구현했다.


public class FactoryOfDeveloperFactory {

    public void getAJob(String type) {
        DeveloperFactory developerFactory;
        switch (type) {
            case "me":
                developerFactory = new MeDeveloperFactory();
                break;
            case "django":
                developerFactory = new DjangoDeveloperFactory();
                break;
            default:
                throw new RuntimeException("invalid type!");
        }

        developerFactory.createLanguage();
        developerFactory.createField();
        System.out.println("개발자 생성 완료!");
    }
}

마지막으로 FactoryOfDeveloperFactorygetAJob()에서는 type별로 알맞은 팩토리를 가져와 개발자를 찍어내어 취업시켜준다. (현실도 이랬으면 얼마나 좋을까...)

예시이므로 생성만 시키고 반환된 인스턴스를 사용하진 않을 것이다.

psvm으로 넘어가보자.


public class Main {

    public static void main(String[] args) {
        FactoryOfDeveloperFactory factoryOfDeveloperFactory = new FactoryOfDeveloperFactory();
        factoryOfDeveloperFactory.getAJob("me");
        System.out.println();
        factoryOfDeveloperFactory.getAJob("django");
    }
}

나("me")와 장고 개발자를 희망하는 취준생("django")을 열심히 공부시켜 개발자로 만들어주자.

출력을 다음과 같다.


추상 팩토리 패턴을 사용하면 FactoryOfDeveloperFactory에서 추상 인터페이스로 제품을 공급받을 수 있다.
어떤 제품이 존재하는지는 관심 없고 단순히 추상화되어있는 인터페이스(createLanguage(), createField())를 사용하면 된다.

추상 팩토리 패턴과 팩토리 메소드 패턴 모두 객체 생성을 캡슐화해서 어플리케이션의 결합을 느슨하게 만든다는 특징이 있다.

하지만 추상 팩토리 패턴은 새로운 제품을 추가하기 위해 인터페이스를 수정해야하기 때문에 구현하고 있는 모든 클래스를 수정해야한다는 단점이 있다.


모든 소스코드는 여기에서 확인할 수 있다.



profile
내일은 개발왕 😎

0개의 댓글