[Design Pattern] 정적 팩토리 메서드 (Static Factory Method)

반달곰수·2024년 3월 11일
0

정적 팩토리 메서드 ?

  • 객체의 생성을 담당하는 메서드
  • 객체를 생성하는 역할을 분리하는 역할
  • 자바는 new 키워드를 사용해 객체를 생성함 → 정적 팩토리 메서드를 통해 new를 간접적으로 사용
  • 즉 new 키워드가 아닌 메서드를 통해 객체를 생성하는 방법임

얻을 수 있는 이점

  1. 메서드를 통해 객체를 생성하는 목적 명시 가능

    new 키워드를 통해 겍체를 생성하는 생성자는 객체 내부의 구조를 잘 알고 있어야 옳바른 목적으로 객체를 생성할 수 있음 →

    정적 팩토리 메서드는 메서드 이름을 통해 객체 생성의 목적을 명시할 수 있음

  • 위에 음악 재생기에 선택해서 음악을 재생 Or 자동으로 음악 재생 처럼 생성에 목적을 명시할 수 있음
  1. 인스턴스에 대해 통제 , 관리가 가능

    메서드를 통해 간접적으로 객체를 생성하기 때문에 전반적인 객체 생성 , 통제 관리가 가능함 → 항상 새로운 객체를 생성해서 반환할 수 있고 또는 객체 하나만 만들어 이를 공유하여 재사용할 수 있음 (싱글톤 패턴)

  • 위에 싱글톤 예제처럼 동일한 객체가 유지됨

  1. 하위 자료형 객체 반환이 가능

    메서드 호출을 통해 얻을 객체의 인스턴스를 자유롭게 선택할 수 있음 (다형성을 응용)


    • 자바 8부터는 인터페이스에 정적 팩토리 메서드 선언이 가능함

    • 또한 위에 예제처럼 이를 응용해 파라미터에 따라서 다른 객체를 반환할 수 있게 분기가 가능함
  2. 객체 생성을 캡슐화 할 수 있음

    new 키워드를 통한 생성자를 사용시 외부에 내부 구현을 드러내야함 , 하지만 정적 팩토리 메서드는 구현부를 외부로 부터 숨길 수 있어 OOP의 특징중 하나인 캡슐화 , 정보은닉을 가능하게 함 , 또한 구현체를 숨겨 의존성을 제거해주는 장점을 가지고 있음

    • 위 예제 처럼 getFruitByPrice 메서드를 호출하여 , Fruit 타입의 객체를 반환하고 , 클라이언트는 Fruit의 구현체인 Apple, Banana, Melon에 존재에 대해서는 모름 , 따라서 클라이언트는 구현체를 신경쓸 필요가 없음

정적 팩토리 메서드의 문제점

  1. 확장성의 제한

    정적 팩토리메서드로 클래스를 설계하면 생성자를 private 제어자로 설정하게 됨 → 따라서 상속을 이용한 확장이 불가능 해짐

  2. 자동 문서화의 어려움

    생성자의 경우 자바의 언어 스펙이기 때문에 자동 문서화 라이브러리 들이 이를 추적하여 자동으로 문서화를 가능하게 해줌 → 하지만 정적 팩토리 메서드는 프로그래머가 임의로 만든 메서드이기 때문에 문서를 보는 사람이 이를 찾고 , 이해해야함

    따라서 정적 팩토리 메서드 네이밍 컨벤션을 잘 지켜서 소통을 원할하게 해야할 필요가 있음

정적 팩토리 메서드 네이밍 컨벤션

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

참고

정적 팩토리 메서드(Static Factory Method)는 왜 사용할까?

예제

정적 팩토리 메서드 사용 예제

0개의 댓글