JAVA/JAVA

정적 팩토리 메소드와 빌더 패턴

호두밥 2023. 6. 24. 15:21

정적 팩토리 메서드

객체의 인스턴스를 반환하는 메소드로 생성자처럼 사용된다.

    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

정적 팩토리 메소드를 사용했을 때의 장점

  1. 다른 타입의 객체를 반환할 수 있고, 메소드 이름으로 반환될 객체의 특성을 설명할 수 있다.
    1. from : 매개변수 1개를 받아서 해당 타입의 인스턴스를 반환하는 메소드
    2. of : 여러 매개변수를 받아 적합한 타입의 인스턴스를 반환하는 메소드
      static <E> List<E> of(E e1, E e2) { 
      return new ImmutableCollections.List12<>(e1, e2); 
      }
      List<String> list = List.of(a, b, c);
    3. valueOf : 여러 매개변수를 받아, 해당 타입의 인스턴스를 반환하는 메소드
      Integer number = Integer.valueOf(123);
    4. getInstance : 인스턴스가 없다면 생성하고, 이미 생성되어 있다면 그 인스턴스를 반환하는 메소드
      public static A getInstance(){ 
      if (instance == null) {    
          instance = new A(); 
       }
       return instance; 
      }
    5. newInstance : 매번 새로운 인스턴스를 반환하는 메소드
      public static A newInstance(){ 
      return new A(); 
      }
    6. get[Type]
      Set<Object> emptySet = Collections.emptySet(); 
      Map<Object, Object> emptyMap = Collections.emptyMap();
  2. 호출할 때마다 인스턴스를 새로 생성하지 않을 수 있다.
  3. 입력 매개변수가 같더라도, 다른 클래스의 객체를 반환할 수 있다.
    Optional<T> value = Optional.ofNullable(T value); 
    Optional<T> value = Optional.of(T value);

빌더 패턴

생성자에 매개변수가 많다면 빌더를 사용해보자.

public class Abcd {
    private final int a;
    private final int b;
    private final int c;
    private final int d;

     public static Builder builder(int a, int b) {
        return new Builder(a, b);
    }
    public Abcd(Builder builder) {
        this.a = builder.a;
        this.b = builder.b;
        this.c = builder.c;
        this.d = builder.d;
    }

    public static class Builder {
        // 필수 매개변수
        private final int a;
        private final int b;
        // 선택 매개변수
        private int c;
        private int d;

        public Builder(int a, int b) {
            this.a = a;
            this.b = b;
        }

        public Builder setC(int c) {
            this.c = c;
            return this;
        }

         public Builder setD(int d) {
            this.d = d;
            return this;
        }

        public Abcd build() {
            return new Abcd(this);
        }
    }
}
Abcd abcd = Abcd.builder(1,2)  
    .setC(3)  
    .setD(4)  
    .build();  

'JAVA > JAVA' 카테고리의 다른 글

Enum, EnumSet, EnumMap  (0) 2023.07.11
I/O  (0) 2022.02.06
인터페이스  (0) 2021.11.30
Optional  (0) 2021.11.07
스트림 Stream  (0) 2021.11.07