소개 상대를 계산하는 부분에 팩토리 패턴을 적용하는 과정을 기록하려고 합니다.
특정 객체에 대해 타입을 나누고, 그에 맞는 클래스들을 만들고 , 구상 클래스를 선택.
Match(소개 상대)도 뭔가 타입이 있을까 ?
Match orderMatch(String type){
Match match;
// 객체 생성 코드를 orderMatch메서드에서 빼기
match.prepare();
match.back();
match.cut();
match.box();
return match;
}
public class SimpleMatchFactory {
public Match createMatch(String type){
Match match = null ;
if(type.equuals("age")){
match = AgePlusMatch();
}
else if(type.equals("hobby")){
match = HobbyPlusMatch();
}
....
}
}
SimpleMatchFactory가 하는 일은 Match를 만드는 일 밖에 없다.
createMatch()메서드를 통해 클라이언트가 새로운 객체 인스턴스를 만들 때 호출.
<aside> 💡 이렇게 캡슐화하게 되면 장점 ? Match(소개 상대)생성 작업을 팩토리 클래스로 캡슐화해 놓으면 , 구현을 변경할 때 여기저기 고칠 필요 없이 팩토리 클래스만 고치면 된다.
</aside>
public class MatchStore {
SimpleMatchFactory factory;
public MatchStore(SImpleMatchFactory factory){
this.factory = factory;
}
public Match orderPizza(String type){
Match match;
match = factory.createMatch(type);
match.prepare();
match.back();
match.cut();
match.box();
return match;
}
}
<aside> <img src="/icons/document_gray.svg" alt="/icons/document_gray.svg" width="40px" /> • BroadStyleMatchStore vs NarrowStyleMatchStore : compatibilityScore이 30점만 넘어도 매칭을 해주도록 하는 generator, compatibilityScore이 50점은 넘어야 매칭을 해주도록 하는 generator
</aside>
<aside> <img src="/icons/document_gray.svg" alt="/icons/document_gray.svg" width="40px" /> • 지역 별 스타일 방식에 따른 분류
</aside>
<aside> <img src="/icons/document_gray.svg" alt="/icons/document_gray.svg" width="40px" /> • 시간 별 스타일 방식에 따른 분류
</aside>
추가적으로 각 지점마다 그 지역의 특성을 반영한 다양한 스타일의 매치(뉴욕 스타일 매치,시카고 스타일 매치) 등이 있을 수 있다.
public abstract class MatchStore {
public Match orderMatch(String type)
{
Match match;
match = createMatch(type);
match.prepare();
match.back();
match.cut();
match.box();
return match;
}
// 팩토리 메서드
protected abstract Match createMatch(String type);
}
팩토리 메서드는 객체 생성을 서브 클래스에 캡슐화할 수 있다. 그러면 슈퍼클래스에 있는 클라이언트 코드와 서브 클래스에 있는 객체 생성 코드를 분리할 수 있다. ( Dependency Injection Principle 적용 - 구상 클래스처럼 구체적인 것이 아니라 추상 클래스나 인터페이스와 같이 추상적이 넋에 의존하는 코드를 만들어야 한다. )