GiYeong

Builder Pattern 본문

CS/Java

Builder Pattern

gy2710 2022. 9. 7. 17:25

빌더 패턴

  • 생성과 관련된 디자인 패턴으로, 복잡한 객체를 생성하는 클래스와 표현하는 클래스를 분리하여 동일한 절차에서도 서로 다른 표현을 생성하는 방법을 제공
  • 생성해야하는 객체가 Optional한 속성을 많이 가질 때 효율적

사용 이유

많은 Optional한 멤버 변수 또는 파라미터, 지속성 없는 상태 값들에 대해 처리해야하는 문제들을 해결

예를 들어 팩토리 패턴이나 추상 팩토리 패턴에서 생성해야하는 클래스에 대한 속성 값이 많을 때 아래와 같은 이슈가 발생한다.

  1. 클라이언트 프로그램에서 팩토리 클래스로 많은 파라미터를 넘겨줄 때, 타입, 순서 등에 대한 관리가 어려워져 에러가 발생할 수 있다.
  2. 경우에 따라 필요없는 파라미터들에 대해 팩토리 클래스에 일일히 null 값을 넘겨줘야 한다.
  3. 생성해야하는 sub 클래스가 무거워지고 복잡해짐에 따라 팩토리 클래스 또한 복잡해진다.

장점

  • 필요한 데이터만 설정할 수 있다.
  • 유연성을 확보할 수 있다.
  • 가독성을 높일 수 있다.
  • 불변성을 확보할 수 있다.

 

예제

public class Computer {
	
    //required parameters
    private String HDD;
    private String RAM;
	
    //optional parameters
    private boolean isGraphicsCardEnabled;
    private boolean isBluetoothEnabled;
	
 
    public String getHDD() {
        return HDD;
    }
 
    public String getRAM() {
        return RAM;
    }
 
    public boolean isGraphicsCardEnabled() {
        return isGraphicsCardEnabled;
    }
 
    public boolean isBluetoothEnabled() {
        return isBluetoothEnabled;
    }
	
    private Computer(ComputerBuilder builder) {
        this.HDD=builder.HDD;
        this.RAM=builder.RAM;
        this.isGraphicsCardEnabled=builder.isGraphicsCardEnabled;
        this.isBluetoothEnabled=builder.isBluetoothEnabled;
    }
	
    //Builder Class
    public static class ComputerBuilder{
 
        // required parameters
        private String HDD;
        private String RAM;
 
        // optional parameters
        private boolean isGraphicsCardEnabled;
        private boolean isBluetoothEnabled;
		
        public ComputerBuilder(String hdd, String ram){
            this.HDD=hdd;
            this.RAM=ram;
        }
 
        public ComputerBuilder setGraphicsCardEnabled(boolean isGraphicsCardEnabled) {
            this.isGraphicsCardEnabled = isGraphicsCardEnabled;
            return this;
        }
 
        public ComputerBuilder setBluetoothEnabled(boolean isBluetoothEnabled) {
            this.isBluetoothEnabled = isBluetoothEnabled;
            return this;
        }
		
        public Computer build(){
            return new Computer(this);
        }
 
    }
 
}
  • Computer 클래스가 setter 없이 getter만 가지며, public 생성자가 없다.
  • 따라서 객체를 얻기 위해서는 오직 builder 클래스를 통해서만 가능하다.
public class TestBuilderPattern {
 
    public static void main(String[] args) {
        Computer comp = new Computer.ComputerBuilder("500 GB", "2 GB")
                .setBluetoothEnabled(true)
                .setGraphicsCardEnabled(true)
                .build();
    }
 
}
  • 필수 값은 생성자로 받고, Optional한 값은 메서드를 통해 선택적으로 입력받는다.

'CS > Java' 카테고리의 다른 글

Factory Pattern  (0) 2022.09.07
Singleton Pattern  (0) 2022.09.07
Java - 6  (0) 2022.06.13
Java - 5  (0) 2022.06.11
Java - 4  (0) 2022.06.10
Comments