본문 바로가기

코드 디자인 패턴/java

[java & 디자인 패턴] Builder 패턴 학습 정리

주제
빌더 패턴의 개념
직접 구현 예제

 

개념


사용하는 경우

객체 생성 과정이 복잡할 경우, 코드를 간단하게 하기 위해 사용한다.

 

인스턴스를 생성할 때, 필드 변수를 세팅하기 위해 입력해야할 인자가 많은 경우, 혹은 필드 변수를 생성자로 세팅하고 싶은데 유연하게 일부만 세팅해야 할 수 있다. 이럴 때, 생성자 함수를 모든 경우에 맞게 일일히 만드는 건 가독성의 측면에서 좋지 않다.

setter 함수로 필드 설정을 할 수도 있지만, 매 줄 마다 인자를 세팅하는 과정에서 코드가 길어진다.ㅊㄹ

 

이럴 때 빌드 패턴을 사용하면 다음같이 닷 체인 문법으로 유연하게 인스턴스 설정이 가능하다.

Character c1 = Member.builder().name(“char”).age(28).male(30).build();

 

 

빌더 패턴은 크게 두 가지인데, 고전적 빌더 패턴(gof design pattern)과 이펙티브 자바의 빌더 패턴으로 구분된다. 여기서는 후자를 다룰 예정.

 

 

구현


빌더에서 세터는 변수 이름과 똑같게 사용해도 좋다. 즉, setName 대신, name이라고 해도 좋다.

이렇게 빌더 패턴을 쓰면 클라이언트 코드에서 유연하게 필드 변수를 세팅하며 짧은 코드를 사용할 수 있다.

 

package step2.prac;

public class Character {
	private String name;
	private int age;
	private String sex;
	private String job;

	private Character(CharacterBuilder builder) {
		this.name = builder.name;
		this.age = builder.age;
		this.sex = builder.sex;
		this.job = builder.job;
	}

	public static class CharacterBuilder {
		private String name;
		private int age;
		private String sex;
		private String job;

		
		public CharacterBuilder() {
			// TODO Auto-generated constructor stub
		}
		
		public CharacterBuilder setName(String name) {
			this.name = name;
			return this;
		}

		public CharacterBuilder setAge(int age) {
			this.age = age;
			return this;
		}

		public CharacterBuilder setSex(String sex) {
			this.sex = sex;
			return this;
		}

		public CharacterBuilder setJob(String job) {
			this.job = job;
			return this;
		}

		public Character build() {
			return new Character(this);
		}

	}

}

// 클라이언트 코드
public class Client {
	public static void main(String[] args) {

		Character character = new Character.CharacterBuilder()
        .setName("charchar").setAge(28).setSex("male")
		.setJob("coder").build();
		System.out.println("debug");
	}

}