IT/java|Spring

[디자인패턴] 점층적 생성자 패턴 (Telescoping Constructor Pattern)

snapcoder 2024. 10. 25. 15:10
728x90
반응형
SMALL

[디자인패턴] 점층적 생성자 패턴 (Telescoping Constructor Pattern)

 

 

 

 

 

 

 

출처 https://blog.naver.com/seek316/222074270048

 

 

 

 

 

개요

객체 생성 방식에서 필드가 많을 때의 문제를 해결하기 위한 방법 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)

 

[디자인패턴] 자바빈즈 패턴 (JavaBeans Pattern)

 

snapcode.tistory.com

 

 

 

 

728x90
반응형
LIST