ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [DESIGN PATTERN] 빌더 패턴
    study/design pattern 2020. 8. 30. 17:42

    빌더 패턴

    필드가 많은 객체를 생성할 경우 생성자를 이용하면 다루기도 어렵고 헷갈릴 수도 있다.

    @Getter @Setter
    public class Computer {
        private String HDD;
        private String RAM;
        private String graphicCard;
        private String CPU;
    
        private boolean isGraphicCardEnable;
        private boolean isBluetoothEnable;
    }

    이 필드 중에는 객체로 생성할 때 꼭 포함되어야 하는 필드도 있고 그렇지 않은 필드도 있다.

    꼭 포함되어야 하는 필드들은 생성자의 매개변수로 꼭 포함이 되어있어야 한다.

    꼭 포함되어야 하는 필드들이 많아질수록 생성자는 그만큼 복잡해진다.

    또 각 필드마다 자리가 정해져있기 때문에 순서도 맞춰서 생성자로 값을 주입해주어야 하는 불편함도 생긴다.

    public Computer(String HDD, 
                    String RAM, 
                    String graphicCard, 
                    String CPU, 
                    boolean isGraphicCardEnable, 
                    boolean isBluetoothEnable) {
            this.HDD = HDD;
            this.RAM = RAM;
            this.graphicCard = graphicCard;
            this.CPU = CPU;
            this.isGraphicCardEnable = isGraphicCardEnable;
            this.isBluetoothEnable = isBluetoothEnable;
    }

     

    이런 상황에서 도움이 되는 것이 빌더 패턴이다.

    빌더 패턴을 사용하면 도메인에 적합한 객체를 생성하는 빌더라는 동반자 객체를 만들 수 있다.

    @Getter @Setter
    public class Computer {
    
        private String HDD;
        private String RAM;
        private String graphicCard;
        private String CPU;
    
        private boolean isGraphicCardEnable;
        private boolean isBluetoothEnable;
    
        private Computer(Builder builder) {
            this.HDD = builder.HDD;
            this.RAM = builder.RAM;
            this.graphicCard = builder.graphicCard;
            this.CPU = builder.CPU;
            this.isGraphicCardEnable = builder.isGraphicCardEnable;
            this.isBluetoothEnable = builder.isBluetoothEnable;
        }
    
        public static class Builder{
            private String HDD;
            private String RAM;
            private String graphicCard;
            private String CPU;
    
            private boolean isGraphicCardEnable;
            private boolean isBluetoothEnable;
    
            public Builder(String HDD, String RAM){
                this.HDD = HDD;
                this.RAM = RAM;
            }
    
            public Builder graphicCard(String graphicCard){
                this.graphicCard = graphicCard;
                return this;
            }
    
            public Builder CPU(String CPU){
                this.CPU = CPU;
                this.isGraphicCardEnable = true;
                return this;
            }
    
            public Builder bluetooth(boolean isBluetoothEnable){
                this.isBluetoothEnable = isBluetoothEnable;
                return this;
            }
    
            public Computer build(){
                return new Computer(this);
            }
    
    
        }
    }
    

     

    위 코드를 보면 Computer 클래스의 생성자가 private로 설정되어 있는 것을 볼 수 있다.

    Computer 클래스는 builder를 통해서만 생성자에 접근할 수 있다는 것을 보여준다.

    아래는 직접 구현한 빌더 클래스를 사용하는 예제이다.

    public static void main(String[] args) {
            Computer computer = new Computer.Builder("500GB", "2GB")
                    .bluetooth(true)
                    .CPU("i5")
                    .graphicCard("GTX")
                    .build();
    
            System.out.println(computer.getCPU());
            System.out.println(computer.getGraphicCard());
            System.out.println(computer.isGraphicCardEnable());
    }
    
    
    //결과
    i5
    GTX
    true

     

     

    정리

    빌더 패턴은 객체 생성을 깔끔하게, 그리고 유연하게 할 수 있도록 도와준다.

    생성자 인자가 많을 경우에는 빌더 패턴을 사용하는 것이 더 편리하다.

    lombok에서 @Builder라는 어노테이션을 제공하고 있어서 생성자나 클래스에 @Builder 어노테이션을 명시해주면

    어노테이션이 명시된 범위에 해당하는 만큼 빌더 클래스를 자동으로 제공해준다.

    'study > design pattern' 카테고리의 다른 글

    [DESIGN PATTERN] 템플릿 메서드 패턴  (0) 2020.08.30
    [DESIGN PATTERN] Strategy 패턴  (0) 2020.08.30
Designed by Tistory.