2022-03-14 @이영훈
팩토리 메소드
클라이언트가 object를 만들 때 생성 방법을 몰라도 팩토리에 어떤 object를 만들지 요청만 하면되는 팩토리 패턴을 확장한 것이 팩토리 메소드 패턴입니다. 팩토리에 여러 기능을 추가하고 싶을 때 사용하면 좋은 패턴입니다.
포켓몬 빵 공장, 파리바게뜨 빵 공장 예시
포켓몬 빵 공장은 빵에 포켓몬 스티커를 넣을 수 있는 특화 기능이 있습니다. 파리바게뜨 빵 공장은 선물 포장이라는 특화 기능이 있습니다.
전체적인 구조는 다음과 같습니다
포켓몬 빵 공장, 파리바게뜨 빵 공장 예시 구현
빵 인터페이스입니다. 빵 정보를 출력하는 Info() 함수가 있습니다.
public interface Bread {
public void info();
}
Java
복사
포켓몬 빵입니다. Bread를 구현하여 만들었고, 포켓몬 스티커 기능을 확인할 수 있습니다.
public class PokemonBread implements Bread {
private final String name;
private String pokemon;
public PokemonBread(String name) {
this.name = name;
}
@Override
public void info() {
System.out.println("포켓몬 빵: " + name + ", 포켓몬: " + pokemon);
}
public void setPokemon(String pokemon) {
this.pokemon = pokemon;
}
}
Java
복사
파리바게뜨 빵입니다. Bread를 구현하여 만들었고, 빵의 선물 포장 기능 유무 클래스 변수를 추가하였습니다.
public class ParisBaguetteBread implements Bread {
private final String name;
private boolean giftWrapped;
public ParisBaguetteBread(String name) {
this.name = name;
}
@Override
public void info() {
System.out.println("파바 빵: " + name + ", 선물 포장: " + giftWrapped);
}
public void setGiftWrapped(boolean giftWrapped) {
this.giftWrapped = giftWrapped;
}
}
Java
복사
빵 공장 인터페이스입니다. 빵 생성 함수가 있습니다.
public interface BreadFactory {
public Bread createBread();
}
Java
복사
포켓몬 빵 공장입니다. 포켓몬 스티커를 지정할 수 있는 특화 기능이 추가되었습니다.
public class PokemonBreadFactory implements BreadFactory {
private final List<String> producedPokemons = new ArrayList<>();
@Override
public Bread createBread() {
return createBread("피카츄"); // 피카츄가 기본 스티커
}
public Bread createBread(String pokemon) {
PokemonBread bread = new PokemonBread("포켓몬 빵");
bread.setPokemon(pokemon);
producedPokemons.add(pokemon);
return bread;
}
public List<String> getProducedPokemons() {
return producedPokemons;
}
}
Java
복사
파리바게뜨 빵 공장입니다. 빵을 포장할 수 있는 특화 기능이 추가되어있음을 확인할 수 있습니다.
public class ParisBaguetteBreadFactory implements BreadFactory {
private int giftWrappedCount = 0;
@Override
public Bread createBread() {
return createBread(false); // 기본은 선물 포장 안함
}
public Bread createBread(boolean giftWrapped) {
ParisBaguetteBread bread = new ParisBaguetteBread("바게뜨");
bread.setGiftWrapped(giftWrapped);
if (giftWrapped) {
giftWrappedCount++;
}
return bread;
}
public int getGiftWrappedCount() {
return giftWrappedCount;
}
}
Java
복사
코드 실행
public class FactoryMethodApplication2 {
public static void main(String[] args) {
ParisBaguetteBreadFactory parisBaguetteBreadFactory = new ParisBaguetteBreadFactory();
PokemonBreadFactory pokemonBreadFactory = new PokemonBreadFactory();
// 파바빵 생산
Bread parisBread1 = parisBaguetteBreadFactory.createBread();
parisBread1.info(); // 파바 빵: 바게뜨, 선물 포장: false
// 🥖파바빵 공장 특화 기능1: 선물 포장 가능
Bread parisBread2 = parisBaguetteBreadFactory.createBread(true);
parisBread2.info(); // 파바 빵: 바게뜨, 선물 포장: true
// 🥖파바빵 공장 특화 기능2: 선물 포장 개수 확인
int giftWrappedCount = parisBaguetteBreadFactory.getGiftWrappedCount();
System.out.println("giftWrappedCount = " + giftWrappedCount); // giftWrappedCount = 1
// 포켓몬빵 생산
Bread pokemonBread1 = pokemonBreadFactory.createBread();
pokemonBread1.info(); // 포켓몬 빵: 포켓몬 빵, 포켓몬: 피카츄
// ⚡️포켓몬빵 공장 특화 기능1: 포켓몬 스티커 선택
Bread pokemonBread2 = pokemonBreadFactory.createBread("뮤");
pokemonBread2.info(); // 포켓몬 빵: 포켓몬 빵, 포켓몬: 뮤
// ⚡️포켓몬빵 공장 특화 기능2: 생상된 포켓몬 스티커 확인
List<String> producedPokemons = pokemonBreadFactory.getProducedPokemons();
System.out.println("producedPokemons = " + producedPokemons); // producedPokemons = [피카츄, 뮤]
}
}
Java
복사