[디자인패턴] 점층적 생성자 패턴 (Telescoping Constructor Pattern)
개요
객체 생성 방식에서 필드가 많을 때의 문제를 해결하기 위한 방법 3가지 (패턴 하나씩 포스팅 진행)
1. 생성자에 필드가 적다면? => 점층적 생성자 패턴
2. 필드가 많고, 대부분의 필드가 선택적이면? => 자바 빈즈 패턴
3. 필드가 많고, 대부분의 필드가 필수적이면? => 빌더 패턴
하나씩 재미있게 읽어보실 수 있도록 깔끔한 스토리텔링식으로 작성해보겠습니다~
한눈에 보는 패턴별 장단점
점.생. 패턴 개념
첫번째 디자인 패턴은 점층적 생성자 패턴입니다.
가장 기초적인 패턴입니다.
- 여러 생성자를 사용해 필드의 조합을 다르게 하여 객체 생성함
- 필수 필드를 포함한 생성자부터 점진적으로 선택적 필드를 추가함
=> 쉽게말하면, 필드 조합별로 일일이 선언해주는 방식..!
생성자(매개변수1);
생성자(매개변수2);
생성자(매개변수3);
생성자(매개변수1, 매개변수2);
생성자(매개변수1, 매개변수3);
생성자(매개변수2, 매개변수3);
생성자(매개변수1, 매개변수2, 매개변수3);
매개변수가 3개인데도 벌써 비효율적이란게 느껴집니다
장점
- *불변성 보장 가능 (생성 시 필요한 필드만 설정)
- 필수 값 설정 후 바로 객체 사용 가능
단점
- 가독성 저하 : 필드가 많아지면 생성자 수 증가 => 코드 복잡성 증가 => 비효율적임
- 유연성 부족 : 모든 필드를 생성자 매개변수로 받음 => 순서나 값 설정에서 실수할 가능성 증가 => 불편함
- 사용의 어려움 : 매개변수의 위치에 따라 어떤 값이 설정되는지 직관성 저하
ex. 생성자(매개변수, 매개변수, 매개변수, 매개변수, 매개변수, 매개변수, 매개변수, 매개변수, 매개변수, 매개변수, ...)
* 불변성 보장이란?
객체 생성 시 모든 필드를 초기화하고, 이후에는 필드를 변경할 수 없도록 하는 것.
- 점층적 생성자 패턴에서 불변성이 보장되는 이유
1. 모든 필드는 생성자에서만 초기화
2. 필드에 final 상수 키워드 사용
- 불변성 보장의 장점
1. 안정적인 객체 상태 유지
2. 멀티스레드 환경에서 안전
3. 객체 일관성 보장
4. 버그 발생 가능성 감소
코드 예시
public class NutritionFacts {
private final int servingSize;
private final int servings;
private final int calories;
private final int fat;
private final int sodium;
private final int carbohydrate;
// 필수 파라미터들만 받는 생성자
public NutritionFacts(int servingSize, int servings) {
this(servingSize, servings, 0);
}
// 필수 + 선택적 파라미터들을 받는 생성자
public NutritionFacts(int servingSize, int servings, int calories) {
this(servingSize, servings, calories, 0);
}
// 나머지 생성자들...
public NutritionFacts(int servingSize, int servings, int calories, int fat) {
this.servingSize = servingSize;
this.servings = servings;
this.calories = calories;
this.fat = fat;
this.sodium = 0;
this.carbohydrate = 0;
}
}
이 패턴은,
생성자를 만들때, 필드가 많다면 여러개의 매개변수를 한줄로 (괄호) 안에 쭉 늘어뜨려 선언해줘야 하는게 가독성도 안좋고,
서로 다른 조합의 필드에 대한 선언들로 소스코드는 지저분해질거고,
매개변수의 순서나 조합에 제한적이어서 불편하다.
보완 포인트 (=자바 빈즈 패턴이 생겨난 이유)
- 가독성 향상 : Setter 메서드 기반 필드 설정 => 직관적 코드 => 어떤 필드가 설정되는지 명확히 확인 가능해짐
- 유연성 강화 : 기본 생성자로 객체 생성 후 필요한 필드만 선택적 설정 가능 => 매개변수 순서나 조합 자유로워짐 => 편해짐
빈 생성자를 만들어서 Setter 메서드로 필드를 설정해주는 자바 빈즈 패턴을 알아보러 가자!
2024.10.25 - [IT/java|Spring] - [디자인패턴] 자바빈즈 패턴 (JavaBeans Pattern)