아무거나

[Design Pattern] Factory Method Pattern 본문

Java/Java

[Design Pattern] Factory Method Pattern

전봉근 2019. 12. 7. 16:26
반응형

팩토리 메소드 패턴(Factory Method Pattern)

  • 팩토리 메소드 패턴에서 템플릿 메소드 패턴의 사용됨을 알 수 있다.
  • 팩토리 메소드 패턴에서의 구조와 구현의 분리를 이해하고 구조와 구현의 분리의 장점을 안다.

이번 내용은 먼저 코드를 작성하고 구조를 알아야 위의 본문을 이해하기 쉽다.

팩토리 메소드 패턴 예시 - 1

[요구사항]

  • 게임 아이템과 아이템 생성을 구현
    • 아이템을 생성하기 전에 데이터 베이스에서 아이템 정보를 요청
    • 아이템을 생성 후 아이템 복제 등의 불법을 방지하기 위해 데이터 베이스에 아이템 생성 정보를 저장
  • 아이템을 생성하는 주체를 ItemCreator로 이름 정의
  • 아이템은 item 이라는 interface로 다룰 수 있게 한다.
    • item은 use 함수를 기본 함수로 갖고 있다.
  • 현재 아이템의 종류는 체력 회복 물약, 마력 회복 물약이 있다.

게임 아이템과 아이템 생성을 구현하기 위하여 먼저 패키지를 생성

  • concreate, framework 라는 이름의 패키지를 생성

게임 아이템과 아이템 생성을 구현 [framework/Item.java]

package com.bkjeon.factory_method.framework;

public interface Item {
    public void use();
}

[framework/ItemCreator.java]

package com.bkjeon.factory_method.framework;

public abstract class ItemCreator {

    // 팩토리 메소드 -> 템플릿 메소드 패턴이 사용 됨
    public Item create() {
        Item item;

        // 아이템을 생성하는 단계 즉, step 별로 나뉘어져 템플릿 메소드 패턴처럼 되어있다.
        requestItemsInfo();    // db요청 step1
        item = createItem();    // 아이템 생성 step2
        createItemLog();    // 로그 step3

        return item;
    }

    // 아이템을 생성하기 전에 데이터 베이스에서 아이템 정보를 요청한다.
    abstract protected void requestItemsInfo();

    // 아이템을 생성 후 아이템 복제 등의 불법을 방지하기 위해 데이터 베이스에 아이템 생성 정보를 남긴다.(=로그)
    abstract protected void createItemLog();

    // 아이템을 생성하는 알고리즘
    abstract protected Item createItem();
}

체력 회복 물약 관련 클래스를 생성 [HpPotion.java]

package com.bkjeon.factory_method.concrete;

import com.bkjeon.factory_method.framework.Item;

public class HpPotion implements Item {

    @Override
    public void use() {
        System.out.println("체력 회복");
    }

}

[HpCreator.java]

package com.bkjeon.factory_method.concrete;

import com.bkjeon.factory_method.framework.Item;
import com.bkjeon.factory_method.framework.ItemCreator;

import java.util.Date;

public class HpCreator extends ItemCreator {

    @Override
    protected void requestItemsInfo() {
        System.out.println("데이터베이스에서 체력 회복 물약의 정보를 가져온다.");
    }

    @Override
    protected void createItemLog() {
        System.out.println("체력 회복 물약을 새로 생성 했다." + new Date());
    }

    @Override
    protected Item createItem() {
        return new HpPotion();
    }

}

같은 방식으로 마력 회복 물약도 생성 [MpPotion.java]

package com.bkjeon.factory_method.concrete;

import com.bkjeon.factory_method.framework.Item;

public class MpPotion implements Item {

    @Override
    public void use() {
        System.out.println("마력 회복");
    }

}

[MpCreator.java]

package com.bkjeon.factory_method.concrete;

import com.bkjeon.factory_method.framework.Item;
import com.bkjeon.factory_method.framework.ItemCreator;

import java.util.Date;

public class MpCreator extends ItemCreator {

    @Override
    protected void requestItemsInfo() {
        System.out.println("데이터베이스에서 마력 회복 물약의 정보를 가져온다.");
    }

    @Override
    protected void createItemLog() {
        System.out.println("마력 회복 물약을 새로 생성 했다." + new Date());
    }

    @Override
    protected Item createItem() {
        return new MpPotion();
    }

}

실행결과를 확인하기 위하여 Main 클래스 생성 [Main.java]

package com.bkjeon.factory_method.concrete;

import com.bkjeon.factory_method.framework.Item;
import com.bkjeon.factory_method.framework.ItemCreator;

public class Main {

    public static void main(String[] args) {
        ItemCreator creator;
        Item hpItem;
        Item mpItem;

        creator = new HpCreator();
        hpItem = creator.create();

        hpItem.use();

        creator = new MpCreator();
        mpItem = creator.create();

        mpItem.use();
    }

}

실행결과

데이터베이스에서 체력 회복 물약의 정보를 가져온다.
체력 회복 물약을 새로 생성 했다.Wed Dec 04 22:33:29 KST 2019
체력 회복
데이터베이스에서 마력 회복 물약의 정보를 가져온다.
마력 회복 물약을 새로 생성 했다.Wed Dec 04 22:33:29 KST 2019
마력 회복

즉, 우리가 나중에 다른 아이템을 생성할 때 Item과 ItemCreator를 구현하면 다른 소스의 변경없이 사용할 수 있다. -> 구조와 구현의 분리

 

참고: https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4/dashboard

반응형

'Java > Java' 카테고리의 다른 글

[Design Pattern] Prototype Pattern  (0) 2019.12.08
[Design Pattern] Singleton Pattern  (0) 2019.12.07
[Design Pattern] Template Method Pattern  (0) 2019.12.07
[Design Pattern] Strategy Pattern  (0) 2019.12.07
[Design Pattern] Adapter Pattern  (0) 2019.12.07
Comments