일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Spring
- jsp
- laravel
- Design Patterns
- Spring Batch
- tool
- redis
- ReactJS
- AWS
- linux
- JVM
- elasticsearch
- Gradle
- jenkins
- php
- Spring Boot
- devops
- Web Server
- 요리
- Git
- ubuntu
- java
- MySQL
- it
- springboot
- Oracle
- javascript
- IntelliJ
- 맛집
- db
Archives
- Today
- Total
아무거나
[Design Pattern] Factory Method Pattern 본문
반응형
팩토리 메소드 패턴(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를 구현하면 다른 소스의 변경없이 사용할 수 있다. -> 구조와 구현의 분리
반응형
'Java & Kotlin > 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