개발
home
🏭

[디자인 패턴] 팩토리 메소드 패턴

Created
2022/03/14
Tags
Design Pattern
Factory Method
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
복사

Ref.