디자인패턴) Factory Method

박우영·2023년 5월 22일
0

디자인 패턴

목록 보기
4/5

들어가기 앞서...

DDD 방식으로 개발함에있어 애그리거트 구현을 할때 주로 팩토리 메서드를 사용하여 구현하는것으로 알고있습니다. 좀 더 깊게 알기위해 참고교재 를 보며 학습했습니다.
이번 학습을 통해 2가지를 배우고싶습니다.

  • 왜 사용하는건지? 장점이 무엇인가
  • 어떻게 사용해야 잘 사용한건지?

또한 이번 GoodJob 프로젝트에서 채용 관련 API 를 하는데 이에도 활용 하고자 합니다.
Ex) 잡코리아, 사람인
이 두개는 제공하는 API 가 다릅니다. 한 곳은 Json, 한곳은 XML의 형태로 제공하는데 이에도 활용할 수 있을것이라 생각합니다.

Factory Method 패턴이란?


상위 클래스에서 뼈대를 만들고 하위 클래스에서 구체적인 처리를 구현하는 패턴입니다. Factory Method 패턴에서는 인스턴스 생성방법을 상위 클래스에서 결졍 하되, 구체적인 클래스 이름까지 정의하지 않습니다. 구체적인 살은 모두 하위 클래스에서 붙입니다. 이로써 인스턴스 생성을 위한 뼈대(프레임워크)와 실제 인스턴스를 생성하는 클래스를 나누어 생각할 수 있습니다.

순수 JAVA 코드


2개의 패키지(framework, idcard)를 사용하고
4개의 클래스(Product, Factory, IdCard, IdCardFactory) 를 사용합니다.

Product

package factorymethod.framework;

public abstract class Product {
    public abstract void use();
}

먼저 Product 클래스 입니다. 추상클래스로 만들었고 use메서드 또한 추상화 합니다.

Factory

package factorymethod.framework;

public abstract class Factory {
    public final Product create(String owner) {
        Product p = createProduct(owner);
        registerProduct(p);
        return p;
    }
    protected abstract Product createProduct(String owner);

    protected abstract void registerProduct(Product product);
}

Factory 메서드는 String 매개변수를 받아 Product를 생성하는 create 메서드와 registerProduct 메서드를 추상화합니다.

IdCard

package factorymethod.idcard;

import factorymethod.framework.Product;

public class IdCard extends Product {
    private String owner;

    IdCard(String owner) {
        System.out.println(owner + "의 카드를 만듭니다.");
        this.owner = owner;
    }

    @Override
    public void use() {
        System.out.println(this + "을 사용합니다");
    }

    @Override
    public String toString() {
        return "[IdCard:" + owner + "]";
    }

    public String getOwner() {
        return owner;
    }
}

Product를 구체화하는 IdCard 클래스 입니다. use 를 Override하여 메서드를 재정의하고 IdCard의 생성자를 만듭니다.

IdCardFactory

package factorymethod.idcard;

import factorymethod.framework.Factory;
import factorymethod.framework.Product;

public class IdCardFactory extends Factory {

    @Override
    protected Product createProduct(String owner) {
        return new IdCard(owner);
    }

    @Override
    protected void registerProduct(Product product) {
        System.out.println(product + "을 등록했습니다.");
    }
}

Factory를 구체화한 IdCardFactory 클래스 입니다. Factory의 메서드들을 Override하여 재정의 합니다.

Main

        /**
         * Factory Method
         */

        Factory factory = new IdCardFactory();
        Product card1 = factory.create("1번");
        Product card2 = factory.create("2번");
        Product card3 = factory.create("3번");
        card1.use();
        card2.use();
        card3.use();

실행과정
IdCardFactory 객체를 생성합니다.

출력결과

1번의 카드를 만듭니다.
[IdCard:1번]을 등록했습니다.
2번의 카드를 만듭니다.
[IdCard:2번]을 등록했습니다.
3번의 카드를 만듭니다.
[IdCard:3번]을 등록했습니다.
[IdCard:1번]을 사용합니다
[IdCard:2번]을 사용합니다
[IdCard:3번]을 사용합니다

0개의 댓글