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

이재민·2024년 3월 5일
0

디자인패턴

목록 보기
1/3

Static Factory Method Pattern

  • 정적 팩토리 메소드(Static Factory Method) 패턴은 생성자를 호출하여 객체를 생성하는 것이 아닌, Static Method를 사용하여 객체를 생성하는 디자인 패턴이다.
  • 정적 팩토리 메소드를 사용하게 된다면 가독성 좋은 코드를 작성할 수 있게 되고 객체 지향적으로 프로그래밍을 할 수 있다는 장점이 있다

생성자 대신 정적 팩토리 메소드를 고려하라

조슈아 블로그의 저서인 이펙티브 자바 책에서 소개하는 아이템에 “생성자 대신 정적 팩토리 메소드를 고려하라” 를 소개하고 있습니다.

정적 팩토리 메소드 특징

1. 메소드 네이밍을 통해 목적을 표현할 수 있다.

클래스를 설계할 때, 다양한 타입의 객체 생성을 위해 생성자 Overloading을 통해 구현해왔다.

하지만, 이러한 설계는 동료 개발자가 해당 클래스의 내부 구조, 생성자의 인자 순서 등을 알아야 하는 단점이 있다.
이것은 실제로 코드 분석에 많은 시간을 소요하게끔 만든다.

예를 들어 아래 사진과 같이 두가지 형식의 Overloading으로 처리하고, 인자 갯수와 타입이 다르기에 동료 개발자는 생성자의 내부 구조와 인자를 파악해야 한다.

따라서 정적 팩토리 메소드 네이밍을 통해 생성자의 단점을 해결할 수 있다.

아래와 사진과 같이 메소드 네이밍을 통해 클래스 설계자의 의도를 파악할 수 있다.

2. 캡슐화 및 정보 은닉

생성자를 사용하는 경우 외부에 내부 구현을 노출해야 한다는 단점이 있다.

하지만 정적 팩토리 메소드를 이용하면 구현부를 외부로 부터 숨길 수 있어 캡슐화 및 정보 은닉을 할 수 있다는 특징이 존재한다.

아래와 같이 호출하는 클라이언트 입장에서는 내부 구현을 알 필요 없이 createAttendanceCheck() 메소드를 호출하면 날짜에 해당하는 구현체를 받아 볼 수 있다.

AttendanceCheckFactory {

	public static AttendanceCheck createAttendanceCheck(LocalDate currentDate, Long memberSeq) {
	    DayOfWeek dayOfWeek = currentDate.getDayOfWeek();
	    RewardType rewardType;
	    double rewardAmount;
	
	    switch (dayOfWeek) {
	        case MONDAY:
	            rewardType = MONEY;
	            rewardAmount = MONDAY_MONEY_REWARD_AMOUNT;
	            break;
	        case TUESDAY:
	            rewardType = MONEY;
	            rewardAmount = TUESDAY_MONEY_REWARD_AMOUNT;
	            break;
	        case WEDNESDAY:
	            rewardType = MONEY;
	            rewardAmount = WEDNESDAY_MONEY_REWARD_AMOUNT;
	            break;
	        case THURSDAY:
	            rewardType = MONEY;
	            rewardAmount = THURSDAY_MONEY_REWARD_AMOUNT;
	            break;
	        case FRIDAY:
	            rewardType = MONEY;
	            rewardAmount = FRIDAY_MONEY_REWARD_AMOUNT;
	            break;
	        case SATURDAY:
	            rewardType = MONEY;
	            rewardAmount = SATURDAY_MONEY_REWARD_AMOUNT;
	            break;
	
	        default:
	            rewardType = COMMISSION;
	            rewardAmount = COMMISSION_REWARD_AMOUNT;
	            break;
	    }
	
	    return AttendanceCheck.create(currentDate, rewardAmount, rewardType, memberSeq);
}

정적 팩토리 메소드 네이밍 규칙

정적 팩토리 메소등는 네이밍 컨벤션이 존재한다.

  • from : 하나의 매개 변수를 받아서 객체를 생성
  • of : 여러개의 매개 변수를 받아서 객체를 생성
  • getInstance | instance : 인스턴스를 생성. 이전에 반환했던 것과 같을 수 있음.
  • newInstance | create : 새로운 인스턴스를 생성
  • get[OtherType] : 다른 타입의 인스턴스를 생성. 이전에 반환했던 것과 같을 수 있음.
  • new[OtherType] : 다른 타입의 새로운 인스턴스를 생성.

참고
https://tecoble.techcourse.co.kr/post/2020-05-26-static-factory-method/
https://inpa.tistory.com/entry/GOF-%F0%9F%92%A0-%EC%A0%95%EC%A0%81-%ED%8C%A9%ED%86%A0%EB%A6%AC-%EB%A9%94%EC%84%9C%EB%93%9C-%EC%83%9D%EC%84%B1%EC%9E%90-%EB%8C%80%EC%8B%A0-%EC%82%AC%EC%9A%A9%ED%95%98%EC%9E%90

profile
문제 해결과 개선 과제를 수행하며 성장을 추구하는 것을 좋아합니다.

0개의 댓글