소개 상대를 계산하는 부분에 팩토리 패턴을 적용하는 과정을 기록하려고 합니다.

팩토리 패턴 적용

특정 객체에 대해 타입을 나누고, 그에 맞는 클래스들을 만들고 , 구상 클래스를 선택.

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 적용 - 구상 클래스처럼 구체적인 것이 아니라 추상 클래스나 인터페이스와 같이 추상적이 넋에 의존하는 코드를 만들어야 한다. )