[디자인 패턴] 생성 패턴(정적 메소드, 빌더 패턴)

호호빵·2023년 3월 1일
0

Computer Science

목록 보기
13/13

생성 패턴(Creational Patterns)

  • 객체의 생성절차를 추상화하는 패턴
  • 객체 생성, 합성하는 방법이나 객체의 표현 방법을 시스템과 분리
    -> 시스템이 상속(inheritance)보다 복합(composite) 방법을 사용하는 방향으로 진화되어 가면서 더 중요해짐
  • 객체의 생성과 조합을 캡슐화해 특정 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 크게 받지 않도록 유연성을 제공

특징

  • 시스템이 어떤 구체 클래스를 사용하는지에 대한 정보를 캡슐화함
  • 생성패턴은 이들 클래스의 인스턴스들이 어떻게 만들고 결합하는 지에 대한 부분을 완전히 가림

종류

  1. 추상 팩토리 패턴(Abstract Factory Pattern)
    • 동일한 주제의 다른 팩토리를 묶어줌
  2. 팩토리 메소드 패턴(Factory Method Pattern)
    • 생성할 객체의 클래스를 국한하지 않고 객체를 생성
  3. 빌더 패턴(Builder Pattern)
    • 생성과 표기를 분리해 복잡한 객체를 생성
  4. 프로토타입 패턴(Prototype Pattern)
    • 기존 객체를 복제함으로써 객체를 생성
  5. 싱글톤 패턴(Singleton Patern)
    • 한 클래스에 한 객체만 존재하도록 제한



정적 팩토리 메서드 패턴

  • 직접적으로 생성자를 통해 객체를 생성하는 것이 아닌 메서드를 통해서 객체를 생성하는 것
  • 객체 생성 처리를 서브 클래스로 분리해 처리하도록 캡슐화하는 패턴

특징

  • 이름을 가질 수 있다.
  • 호출을 할 때마다 새로운 객체를 생성할 필요가 없다.
  • 하위 자료형 객체를 반환할 수 있다.
  • 객체 생성을 캡슐화할 수 있다.

하위 자료형 객체 반환

  • Level 이라는 상위 타입을 상속받고 있는 Basic, Intermediate, Advanced 클래스
  • 시험 점수에 따라 결정되는 하위 등급 타입을 반환하는 정적 메소드
    -> 다음의 분기처리를 통해 하위 타입의 객체 반환 가능
public class Level {
  ...
  public static Level of(int score) {
    if (score < 50) {
      return new Basic();
    } else if (score < 80) {
      return new Intermediate();
    } else {
      return new Advanced();
    }
  }
  ...
}

단점
1. 생성자 없이 정적 팩토리 메서드만 제공한다면 상속을 할 수 없다.

  • 상속은 public 혹은 protected 생성자가 필요한데, 이러한 생성자 없이 팩토리 메서드만 제공한다면 상속을 할 수 없는 문제가 발생한다.
  1. 개발자가 찾기 어렵다.
  • 일반적인 생성자는 javadoc을 통해 쉽게 찾을 수 있는 반면 정적 팩토리 메서드는 javadoc에서 쉽게 확인할 수 없다. 따라서 개발자는 코드를 보며 정적 팩토리 메서드 방식 클래스를 인스턴스화 할 방법을 찾아야 한다.

네이밍 규칙

이름설명
from매개변수를 1개 받아 해당 타입의 인스턴스 반환
of매개변수를 여러 개 받아 적합한 타입의 인스턴스 반환
valueOffrom, of의 자세한 버전
instance / getInstance매개변수로 명시한 인스턴스를 반환하지만, 같은 인스턴스임을 보장하지는 않음
create / newInstance위와 같지만 매번 새로운 인스턴스 반환
getTypegetInstance와 동일, 다른 클래스에 팩토리 메서드 정의. Type은 반환할 객체 타입
newTypenewInstance와 동일, 다른 클래스에 팩토리 메서드 정의. Type은 반환할 객체 타입
typegetType과 newType의 간결 버전





빌더 패턴

  • 객체 생성과 표현 방법 정의 클래스를 분리
  • 많은 Optional한 멤버 변수(혹은 파라미터)나 지속성없는 상태 값들에 대해 처리해야하는 문제 해결

장점
1. 필요한 데이터만 설정 가능
2. 유연성 확보 가능
3. 가독성을 높임
4. 변경 가능성을 최소화

빌더패턴 구현 방법

  • 빌더클래스를 만들고 사용해야하지만 간단히 @Builder 애노테이션을 사용해 구현함





팩토리 메서드와 빌더

  • 정적 팩토리 메서드 패턴
    • 엔티티 생성시 파라미터로 전달해야하는 데이터가 적은 경우 사용
    • 정적 팩토리 메서드 내부에서 빌더 사용
  • 빌더 패턴
    • 엔티티 생성시 파라미터로 전달해야하는 데이터가 많은 경우 사용







Reference

생성 디자인 패턴 - https://refactoring.guru/ko/design-patterns/creational-patterns
생성 패턴의 종류 - https://velog.io/@ha0kim/Design-Pattern-%EC%83%9D%EC%84%B1-%ED%8C%A8%ED%84%B4Creational-Patterns
정적 팩토리 메서드1 - https://tecoble.techcourse.co.kr/post/2020-05-26-static-factory-method/
정적 팩토리 메서드2 - https://joon2974.tistory.com/16
빌더 패턴1 - https://readystory.tistory.com/121
빌더 패턴2 - https://mangkyu.tistory.com/163
팩토리메서드와 빌더 리팩토링 - https://velog.io/@znftm97/%EB%A6%AC%ED%8C%A9%ED%86%A0%EB%A7%81-%EC%97%94%ED%8B%B0%ED%8B%B0-%EC%83%9D%EC%84%B1%ED%8C%A8%ED%84%B4

profile
하루에 한 개념씩

0개의 댓글