팩토리 예시 질문
199
작성한 질문수 1
안녕하세요!
팩토리패턴 수업 5:00에 생성부분에 로직 변화가 있으면 coffee와 그 subclass만 수정하만 된다고 얘기했는데요. java 예시에서는 CoffeeFactory안에 switch문이 있어서 새로운 커피가 추가될 때마다 switch문의 내용을 바꿔줘야되는데, 이 정도 수정사항은 팩토리 디자인 원칙에 벗어나지 않는건가요?
감사합니다.
답변 1
1
안녕하세요 bnamkung님 ㅎㅎ
이 정도 수정사항은 팩토리 디자인 원칙에 벗어나지 않는건가요?
>> 네 맞습니다.
"객체 생성에 관해 변경되는 로직"이 발생했을 때 CoffeeFactory가 아니라 Latte나 Espresso 클래스에서만 수정하면 되기 때문에 위배되지 않습니다.
물론 팩토리 메서드 내부에서 새로운 객체 타입이 추가될 때마다 switch 문을 수정해야 하므로 이부분 때문에 객체 생성의 확장성을 제한한다고는 할 수 있습니다.
이를 개선하는 방법은 Map을 사용하는 것인데요.
예를 들어 Cafemocha를 추가한다면 다음과 같이 switch 없이 추가할 수 있습니다.
다음 코드처럼 static부분에 map에 해당 키와 값을 추가하는 put 메소드만으로 이를 처리할 수 있습니다.
import java.util.HashMap;
import java.util.Map;
import java.util.function.Supplier;
enum CoffeeType {
LATTE,
ESPRESSO,
CAFEMOCHA
}
abstract class Coffee {
protected String name;
public String getName() {
return name;
}
}
class Latte extends Coffee {
public Latte() {
name = "latte";
}
}
class Espresso extends Coffee {
public Espresso() {
name = "Espresso";
}
}
class Cafemocha extends Coffee {
public Cafemocha() {
name = "Cafemocha";
}
}
class CoffeeFactory {
private static final Map<CoffeeType, Supplier<Coffee>> coffeeMap = new HashMap<>();
static {
coffeeMap.put(CoffeeType.LATTE, Latte::new);
coffeeMap.put(CoffeeType.ESPRESSO, Espresso::new);
coffeeMap.put(CoffeeType.CAFEMOCHA, Cafemocha::new);
}
public static Coffee createCoffee(CoffeeType type) {
Supplier<Coffee> coffee = coffeeMap.get(type);
if (coffee != null) {
return coffee.get();
}
throw new IllegalArgumentException("Invalid coffee type: " + type);
}
}
public class Main {
public static void main(String[] args) {
Coffee latte = CoffeeFactory.createCoffee(CoffeeType.LATTE);
System.out.println(latte.getName()); // latte
Coffee espresso = CoffeeFactory.createCoffee(CoffeeType.ESPRESSO);
System.out.println(espresso.getName()); // Espresso
Coffee cafemocha = CoffeeFactory.createCoffee(CoffeeType.CAFEMOCHA);
System.out.println(cafemocha.getName()); // Cafemocha
}
}
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
REST API (Self-descriptive messages)
0
25
1
시스템 엔지니어 관련 질문입니다.
0
52
2
오버라이딩 관련하여 질문드립니다.
0
62
2
교착상태의 4가지 필요조건이 필요충분조건이 아닌 이유
0
89
1
렌더 트리, 렌더 레이어와 그래픽 레이어
0
57
2
로컬스토리지, 세션스토리지, 쿠키의 공통점
0
68
1
IPv4가 IPv6보다 빠른 경우
0
98
2
UDP가 전송계층의 역할을 못하는 건 아닌지
0
59
1
Path MTU 발견하였음에도 패킷 분할이 필요한 이유?
0
65
2
교재의 LFU 알고리즘에서 6번이 왜 히트인가요?
0
64
2
페이지 교체 알고리즘? 프레임 교체 알고리즘?
0
81
2
Static 키워드가 메모리에 올라가는 시점
0
77
2
헤더 압축부분 질문드립니다
0
72
2
공유 캐시 관련 질문 드립니다.
0
56
2
컨텍스트는 context와 contextual information으로 나눠진다는게 무슨뜻인가요?
0
199
1
회선과 대역폭의 관계
0
61
2
44강 질문
0
93
2
버스 토폴로지 질문 있씁니다
0
55
1
자바스크립트, xml 문법 관련
0
66
2
전략패턴과 의존성주입 질문
0
69
2
Model이 비즈니스 로직을 담당하나요?
0
106
2
CS 공부 하는 법
0
181
2
큰돌님 블로그에 개념정리해서 올려도될까요!
0
137
2
FIN 세그먼트 질문
0
70
2





