[디자인 패턴] Builder 패턴

이멀젼씨

·

2020. 3. 10. 16:25

- 정의

 

복잡한 단계로 생성되는 생성자를 더 쉽고 가독성이 높게 생성할 수 있도록 고안된 패턴이다

 

- UML

1. Computer클래스를 만들고 cpu, ram, storage를 멤버 변수로 갖는다. Getter와 Setter를 설정하고 생성자를 정의한다

2. Computer객체 생성을 도와주는 ComputerBuilder클래스를 만든다. 이 클래스 역시 cpu, ram, storage를 멤버 변수로 갖는다. cpu, ram, storage 메소드를 통해 값을 저장하고 builder메소드로 Computer객체를 생성한다

 

- 코드

 

Computer class

public class Computer {

	private String cpu;
	private String ram;
	private String storage;
	
	public Computer(String cpu, String ram, String storage) {
		this.cpu = cpu;
		this.ram = ram;
		this.storage = storage;
	}
	
	public String getCpu() {
		return cpu;
	}
	public void setCpu(String cpu) {
		this.cpu = cpu;
	}

	public String getRam() {
		return ram;
	}
	public void setRam(String ram) {
		this.ram = ram;
	}
	
	public String getStorage() {
		return storage;
	}
	public void setStorage(String storage) {
		this.storage = storage;
	}
	
	public void printSpec() {
		System.out.println("My Computer [cpu="+cpu+", ram="+ram+", storage="+storage+"]");
	}

}

ComputerBuilder class

public class ComputerBuilder {
	
	private String cpu;
	private String ram;
	private String storage;
	
	public ComputerBuilder cpu(String cpu) {
		this.cpu=cpu;
		return this;
	}
	
	public ComputerBuilder ram(String ram) {
		this.ram=ram;
		return this;
	}
	
	public ComputerBuilder storage(String storage) {
		this.storage=storage;
		return this;
	}	
	
	public Computer build() {
		Computer computer = new Computer(cpu, ram, storage);
		return computer;
	}
}

 

Main class

public class Main {

	public static void main(String[] args) {
		
		Computer computer = new ComputerBuilder()
				.cpu("i7")
				.ram("64g")
				.storage("1TB SSD")
				.build();
		
		computer.printSpec();
		
	}
	
}

 

- 설명

더보기

알아둘 것

1. 점층적 생성자 패턴

필수 매개변수와 매개변수를 1개부터 모든 매개변수를 받는 생성자까지 점층적으로 생성자를 추가하는 패턴 

 

장점

- 한번 생성되면 값이 바뀔 일이 없음

 

단점

- 설정할 필요가 없는 필드에도 인자를 전달해야 하는 경우가 생김

- 인자의 수가 늘어남에 따라 가독성과 유지보수성이 떨어짐

 

 

2. 자바빈 패턴

인자가 없는 생성자를 호출하여 객체를 생성한 뒤, setter를 통해 객체의 필드를 채우는 패턴

 

장점

- 가독성이 높음

 

단점

- 1회의 생성자 호출로 객체를 환성할 수 없음

- setter를 통해 생성 시점 이후에도 값이 변할 수 있기 때문에 객체의 일관성이 깨지게 됨

 

ex)

Computer computer = new Computer();

computer.setCpu("i7");

computer.setRam("16g");

computer.setStorage("256g SSD");

 

 

점층적 생성자 패턴의 안전성(immutable)과 자바빈 패턴의 가독성을 차용하여 만들어졌다

 

장점

- 각 인자가 어떤 의미인지 알기가 쉬움

- 한번에 객체를 생성하므로 일관성을 유지할 수 있음

 

단점

- 객체의 생성에 따라 빌더 역시 함께 생성이 되어야 하기 때문에 성능 이슈에 민감한 시스템이라면 고려해야함