92. 디자인 패턴/생성(Creational)

01. 자바 팩토리 메소드 패턴 (JAVA Factory Method Pattern)

THE HEYDAZE 2020. 6. 19. 22:18

# 참고한 영상
 

자바 디자인 패턴 이해 - YouTube

Gof Design Pattern을 자바 언어로 설명한 강의. 의미 있고 쉬운 예제를 준비하려고 노력했습니다. '좋아요'/'구독' 부탁 드립니다.

www.youtube.com

 

# 설명

객체 직접 생성하는 경우가 있고, 팩토리 메소드 패턴의 역할처럼

간접적으로 객체 생성 후 반환해주는 방식으로 생각해 볼 수 있다

객체 생성대신 수행해주는 공장이라고 생각하면 된다.

 

팩토리 메서드 패턴템플릿 메서드 패턴포함하고 있다

 

# 장점

생성 할 클래스를 미리 알지 못해도 팩토리 클래스가 객체 생성 담당

객체의 자료형이 하위클래스에 의해서 결정 -> 확장성 용이성

동일한 형태로 프로그래밍 가능

확장성 있는 전체 프로젝트 구성 가능

객체가 늘어날 때 마다 하위 클래스 재정의로 인한 불필요한 많은 클래스 생성 가능성

 

# 단점
# 사용 여부
# 사용 방법
# 구조

객체 생성 전 해야 할 작업들을 위한 패턴?

 

# 요구 사항

1. 게임 아이템과 아이템 생성을 구현해주세요.

  • 아이템을 생성하기 전에 데이터 베이스에서 아이템 정보를 요청합니다
  • 아이템 생성 후 아이템 복제 등의 불법을 방지하기 위해 데이터 베이스에 아이템 생성 정보를 남깁니다

2. 아이템을 생성하는 주체를 ItemCreator로 이름 짓습니다.

3. 아이템은 item 이라는 interface로 다룰 수 있도록 합니다.

  • item 은 use 함수를 기본 함수로 갖고 있습니다

4. 현재 아이템의 종류는 체력 회복 물약, 마력 회복 물약이 있습니다.

 

# 변경 사항

1. 마나포션의 기록 데이터 베이스가 MySQL 에서 Oracle로 바뀌었다.

 

# 결과

이미지 클릭

 

# Interface
1
2
3
4
5
6
7
8
/** 아이템 */
public interface Item {
 
    /** 아이템 사용 */
    void use();
 
}
 
cs

 

# Impl

HpPotion.java

1
2
3
4
5
6
7
8
9
10
11
/** 체력 회복 포션 */
public class HpPotion implements Item {
 
    /** 아이템 사용 */
    @Override
    public void use() {
        System.out.println("체력 회복!");
    }
 
}
 
cs

 

MpPotion.java

1
2
3
4
5
6
7
8
9
10
/** 마나 회복 포션 */
public class MpPotion implements Item {
 
    /** 아이템 사용 */
    @Override
    public void use() {
        System.out.println("마력 회복!");
    }
 
}
cs
# Concreator Class

AbstItemCreator.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/** 추상 아이템 Factory Class */
public abstract class AbstItemCreator {
 
    /** STEP 1 아이템을 생성하기 전에 데이터 베이스에서 아이템 정보를 요청합니다 */
    protected abstract void requestItemsInfo();
 
    /** STEP 2 아이템 생성 후 아이템 복제 등의 불법을 방지하기 위해 데이터 베이스에 아이템 생성 정보를 남깁니다 */
    protected abstract void createItemLog();
 
    /** STEP 3 아이템을 생성하는 알고리즘 */
    protected abstract Item createItem();
 
    /** (해당)아이템 생성 */
    public Item create() {
 
        // 여러 아이템을 담기 위한 인터페이스
        Item item;
 
        // STEP 1 DB 요청
        requestItemsInfo();
 
        // STEP 2 생성 된 Item 정보 DB 기록 (id, item_name, user_name, reg_date....)
        createItemLog();
 
        // STEP 3 아이템 생성 완료
        item = createItem();
 
        // 아이템 리턴
        return item;
    }
}
 
cs

 

# Concreate Class (extend)

HpCreator.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/** 체력 회복 포션 아이템 Factory Class */
public class HpCreator extends AbstItemCreator {
 
    /** STEP 1 */
    @Override
    protected void requestItemsInfo() {
        System.out.println("MySQL 데이터베이스에서 회복 물약의 정보를 가져옵니다");
    }
 
    /** STEP 2 */
    @Override
    protected void createItemLog() {
        System.out.println("체력 회복 물약을 새로 생성 했습니다 " + new Date());
    }
 
    /** STEP 3 */
    @Override
    protected Item createItem() {
        return new HpPotion();
    }
}
 
cs

 

MpCreator.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/** 마나 회복 포션 아이템 Factory Class */
public class MpCreator extends AbstItemCreator {
 
    /** STEP 1 */
    @Override
    protected void requestItemsInfo() {
        //System.out.println("MySQL 데이터베이스에서 회복 물약의 정보를 가져옵니다");
        // 변경 사항
        System.out.println("Oracle 데이터베이스에서 회복 물약의 정보를 가져옵니다");
    }
 
    /** STEP 2 */
    @Override
    protected void createItemLog() {
        System.out.println("마력 회복 물약을 새로 생성 했습니다 " + new Date());
    }
 
    /** STEP 3 */
    @Override
    protected Item createItem() {
        return new MpPotion();
    }
}
 
cs

 

# Client

Client.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Client {
 
    public static void main(String[] args) {
 
        AbstItemCreator ic = new HpCreator();
        
        Item item;
 
        item = ic.create();
 
        item.use();
 
        System.out.println();
 
        ic = new MpCreator();
 
        item = ic.create();
 
        item.use();
        
    }
}
 
cs

 

 

# Diagram

 

# 추가 참고 (출처는 밑)

[출처] https://biggwang.github.io/2019/06/28/Design%20Patterns/[Design%20Patterns]%20팩토리%20패턴,%20도대체%20왜%20쓰는거야-기본%20이론편/