디자인 패턴
[Java][디자인 패턴] 3. 팩토리 메서드 패턴 (Factory Method Pattern)
팩토리 메서드 패턴은 팩토리 패턴의 확장 패턴으로, 팩토리 패턴과 템플릿 메서드 패턴이 결합된 패턴이다.
팩토리 메서드 패턴이란?
- 팩토리 메서드는 추상화 기법을 사용하여 패턴을 확장한다.
- 추상화를 사용하면 아직 실제 내용이 구현되지 않은 상태에도 미리 메서드를 호출하여 사용할 수 있다.
- 팩토리 메서드 패턴은 객체를 생성하는 뼈대를 형성할 때 자주 응용한다.
- 팩토리 메서드는 추상화를 통해 하위 클래스에 다형성을 부여한다.
- 팩토리 메서드 패턴은 클래스 결합도가 낮고 유연성이 좋다. 또한 기능 개선 시 기능을 보완하기 위한 리팩터링 작업도 관리한다.
팩토리 메서드 패턴 vs 팩토리 패턴
- 팩토리 패턴
객체 생성을 분리된 클래스로 위임한다. - 팩토리 메서드 패턴
추상화를 통해 정의와 구현을 재 분리한다.
실제적인 객체 생성은 재 분리된 하위 클래스에서 이루어진다.
예제 코드 구조
팩토리 메서드 패턴 예제 코드
1. Chiken 추상 클래스
- 팩토리에서 생성하는 대상
public abstract class Chicken {
public abstract String getName();
}
2. YellowChikenFactory 추상 클래스
- 팩토리 패턴은 객체 생성을 직접 하는데, 팩토리 메서드 패턴은 실제적인 객체 생성을 하위 클래스에 위임한다.
- 예를 들자면 노랑 통닭 본사 (YellowChickenFactory), 노랑 통닭 체인점 (YellowChickenCheinFactory)가 있는 것. 본사가 직접 치킨을 만드는 1인 기업이라면 팩토리 패턴과 같고 본사가 체인점을 운영해서 실질적인 치킨 제조를 맡긴다면 팩토리 메서드 패턴과 같다.
public abstract class YellowChickenFactory {
abstract Chicken create(ChickenType type);
abstract String getFactoryName();
}
2. Chicken을 상속받아 생성하는 치킨 클래스들
- YellowChickenFactory와 같이 본사의 레시피가 있고, 그 레시피로 각 치킨들을 만든다.
- Chicken을 상속받은 FriedChicken(후라이드 치킨), SoySauceChicken(간장 치킨), SweetSpiceChicken(양념치킨)(양념치킨이 영어로 뭐지)
public class FriedChicken extends Chicken{
@Override
public String getName(){
return ChickenType.FRIED_CHICKEN.getValue();
}
}
public class SoySauceChicken extends Chicken{
@Override
public String getName() {
return ChickenType.SOY_SAUCE_CHICKEN.getValue();
}
}
public class SweetSpiceChicken extends Chicken{
@Override
public String getName() {
return ChickenType.SWEET_SPICE_CHICKEN.getValue();
}
}
3. YellowChickenChainFactory
YellowChickenFactory를 상속받아서 직접 치킨을 만드는 클래스
실질적인 치킨 제조를 담당한다.
public class YellowChickenChainFactory extends YellowChickenFactory {
@Override
Chicken create(ChickenType type) {
switch (type) {
case FRIED_CHICKEN:
return new FriedChicken();
case SOY_SAUCE_CHICKEN:
return new SoySauceChicken();
case SWEET_SPICE_CHICKEN:
return new SweetSpiceChicken();
}
return null;
}
@Override
String getFactoryName() {
return "노랑 통닭 강남점";
}
}
4. ChickenType
- 치킨 타입들을 저장하고 있는 Enum 클래스
public enum ChickenType {
FRIED_CHICKEN("FRIED_CHICKEN", "후라이드 치킨"),
SWEET_SPICE_CHICKEN("SWEET_SPICE_CHICKEN", "양념치킨"),
SOY_SAUCE_CHICKEN("SOY_SAUCE_CHICKEN", "간장 치킨"),
;
private final String code;
private final String value;
ChickenType(String code, String value) {
this.code = code;
this.value = value;
}
public String getCode() {
return code;
}
public String getValue() {
return value;
}
}
5. YellowChickenFactoryTest
- 치킨이 잘 만들어졌나 확인하는 테스트 코드
class YellowChickenFactoryTest {
@DisplayName("후라이드 치킨 만들기")
@Test
void createFriedChicken() {
YellowChickenFactory yellowChickenFactory = new YellowChickenChainFactory();
Chicken chicken = yellowChickenFactory.create(ChickenType.FRIED_CHICKEN);
System.out.println(yellowChickenFactory.getFactoryName() + "에서 즐기는 맛있는 " + chicken.getName());
Assertions.assertEquals(ChickenType.FRIED_CHICKEN.getValue(), chicken.getName());
}
@DisplayName("양념 치킨 만들기")
@Test
void createSweetSpiceChicken() {
YellowChickenFactory yellowChickenFactory = new YellowChickenChainFactory();
Chicken chicken = yellowChickenFactory.create(ChickenType.SWEET_SPICE_CHICKEN);
System.out.println(yellowChickenFactory.getFactoryName() + "에서 즐기는 맛있는 " + chicken.getName());
Assertions.assertEquals(ChickenType.SWEET_SPICE_CHICKEN.getValue(), chicken.getName());
}
@DisplayName("간장 치킨 만들기")
@Test
void createSoySauceChicken() {
YellowChickenFactory yellowChickenFactory = new YellowChickenChainFactory();
Chicken chicken = yellowChickenFactory.create(ChickenType.SOY_SAUCE_CHICKEN);
System.out.println(yellowChickenFactory.getFactoryName() + "에서 즐기는 맛있는 " + chicken.getName());
Assertions.assertEquals(ChickenType.SOY_SAUCE_CHICKEN.getValue(), chicken.getName());
}
}
Github 코드
관련 글
1.쉽게 바로 써먹는 디자인 패턴 책
http://www.yes24.com/Product/Goods/93173296
'개발 > 디자인패턴' 카테고리의 다른 글
[Java][디자인 패턴] 6. 프로토타입 패턴 (Prototype Pattern) (0) | 2022.03.05 |
---|---|
[Java][디자인 패턴] 5. 빌더 패턴 (Builder Pattern) (0) | 2022.03.04 |
[Java][디자인 패턴] 4. 추상 팩토리 패턴 (Abstract Factory Pattern) (0) | 2022.03.03 |
[Java][디자인 패턴] 2. 싱글턴 패턴 (Singleton Pattern) (0) | 2022.03.01 |
[Java][디자인 패턴] 1. 팩토리 패턴 (Factory Pattern) (0) | 2022.02.28 |