Builder Pattern

Mixer·2022년 12월 7일
0

Design Pattern

목록 보기
4/5

Bulider Pattern

빌더 패턴은 생성 패턴(Creational Pattern) 중 하나이다.

빌더 패턴은 Optional한 멤버 변수 혹은 파라미터나 지속성 없는 상태 값들에 대해 처리해야하는 문제들을 해결합니다.

또한 별도의 Builder 클래스를 만들어 필수 값에 대해서는 생성자를 통해, 선택적인 값들에 대해서 메서드를 통해 Step-By-Step으로 값을 입력받은 후에 build()메서드를 통해 최종적으로 하나의 인스턴스를 리턴하는 방식이다.

빌더 패터은 굉장히 자주 사용되는 생성 패턴 중 하나로, Retorfit 이나 Okhttp 등 유명 오픈 소스서도 빌더 패턴을 사용하고 있다.

빌더 패턴 구현 개념

  1. 빌더 클래스를 Static Nested Class 로 생성한다, 관례적으로 생성하고자 하는 클래스 이름 뒤에 Builder를 붙인다. (예) Computer Class에 대한 빌더 클래스의 이름은 ComputerBuilder 라고 정의

  2. 빌더 클래스의 생성자는 public으로 하며, 필수 값들에 대해 생성자의 파라미터로 받는다.

  3. Optional한 값들에 대해선 각각의 속성마다 메서드로 제공하며, 중요한 것은 메서드의 리턴 값이 빌더 객체 자신이어야 한다.

  4. 빌더 클래스 내의 Build() 메서드를 정의하여 클라이언트 프로그램에게 최종 생성된 결과물을 제공한다, 이렇게 build()를 통해서만 객체 생성을 제공하기 때문에 생성 대상이 되는 클래스의 생성자는 private으로 정의해야 한다.

구현

public class Computer {
	
    //required parameters
    private String HDD;
    private String RAM;
    
    //optional parameters
    private boolean isGraphicsCardEnabled;
    private boolean isBluetoothEnalbed;
    
    public String getHDD() {
    	return HDD;
    }
    
    public String getRAM() {
    	return RAM;
    }
    
    public boolean isGraphicsCardEnabled() {
    	return isGraphicsCardEnabled;
    }
    
    public boolean isBluetoothEnalbed() {
    	return isBluetoothEnalbed;
    }
    
    //Builder class 
    public static class ComputerBuilder {
    	
        //required parameters
        private String HDD;
        private String RAM;
        
        public boolean isGraphicsCardEnabled;
        public boolean isBluetoothEnalbed;
        
        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 생성자가 없다는 것이다, 그렇기에 Computer 객체를 얻기 위해선 오직 ComputerBuilder 클래스를 통해서만 가능하다.

public class TestBuilderPattern {
	public static void main(String[] args) {
    	Computer com = new Computer.ComputerBuilder("500GB", "2GB")
        	.setBluetoothEnabled(true)
            .setGraphicsCardEnabled(true)
            .build();
    }
}

Computer 객체를 얻기 위해 ComputerBuilder 클래스를 사용하고 있으며 필수 값인 HDD 와 RAM 속성에 대해서 생성자로 받고 Optional한 값인 BluetoothEnabled 와 GraphicsCardEnalbed에 대해서 메서드를 통해 선택적으로 입력받고 있다.
즉, BluetoothEnabled 값이 필요없는 객체라면 setBluetoothEnabled() 메서드를 사용하지 않으면 된다.

Builder 패턴 장점

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

Builder 패턴 단점

  • 선택적 매개변수를 많이 받는 객체를 생성하기 위해서 먼저 빌더 클래스부터 정의해야 한다.
  • 빌더의 생성비용이 크지 않지만, 성능에 민감한 상황에선 문제가 될 수 있다.
  • 만약 매개변수가 4개보다 적다면, 점층적 생성자 패턴을 사용하는 것이 더 효과적이라 한다, 빌더 패턴의 코드가 생각보다 장황하기 때문이다
profile
Minthug'life

0개의 댓글