티스토리 뷰

개발/Java

Builder Pattern

haloper 2016. 5. 6. 13:21

프로젝트를 진행하다 보면, 클래스 생성에 필요한 초기값들이 점점 추가되고 옵션 값들이 많아지면서 생성자 오버로딩이 점점 많아지는 경우를 볼 수 있습니다. 생성자는 method 명으로 기능을 특정지을 수 없기 때문에, 가지고 있는 파라미터의 타입과 갯수만으로 구분해야 합니다. 주석으로 어느정도 가독성을 확보할 수 있지만, 많은 수의 오버로딩을 가진 생성자는 사용도 불편하고 보기에도 영 안 좋습니다.


클래스 생성 시에 다양한 옵션값을 사용해야 할 경우 적용 가능한 패턴이 바로 Builder 패턴 입니다. 객체 생성 시에 필수값만 입력하여 객체를 생성하고, 옵션값들은 필요시에만 설정 가능합니다. 다음과 같은 방식으로 사용 가능합니다.

* Main.java

public class Main {
	
	public static void main(String[] args) {
		User user = new User.Builder("My Name")		// 이름은 필수값 입니다.
				.job("Programmer")					// 나머지 옵션값 입력
				.hobby("swimming")
				.build();							// build를 호출하기 전에는 User 객체는 생성되지 않습니
		System.out.println(user);
	}

}



User 클래스의 내부 클래스인 Builder 클래스를 이용해서 객체를 초기화 합니다. 필수값과 옵션값을 입력하고 build method를 호출하면 그 때 User 객체가 생성됩니다. 객체 생성에 필요한 값들을 입력하는 중간에는 User 객체는 아직 존재하지 않기 때문에, User 객체는 항상 한가지 상태만 가지게 됩니다. Builder 패턴을 사용하지 않고, 단순히 new User("My name") 으로 객체 생성 후 Setter를 이용해서 옵션값들을 입력해 주는 방법을 사용할 경우, User 객체는 짧은 순간이지만 자신의 상태값이 변하게 됩니다.


 Builer 패턴의 구현 방법은 아래와 같습니다.

* User.java

public class User {
	
	private final String name;
	private final int age;
	private final String hobby;
	private final String address;
	private final String birthday;
	private final String job;
	
	public static class Builder {
		private final String name;
	
		private int age;
		private String hobby;
		private String address;
		private String birthday;
		private String job;
		
		public Builder(String name) {
			this.name = name;
		}
		
		public Builder hobby(String hobby) {
			this.hobby = hobby;
			return this;
		}
		public Builder address(String address) {
			this.address = address;
			return this;
		}
		public Builder birthday(String birthday) {
			this.birthday = birthday;
			return this;
		}
		public Builder job(String job) {
			this.job = job;
			return this;
		}
		
		public User build() {
			return new User(this);
		}
	}
	
	private User(Builder builder) {
		this.name = builder.name;
		this.age = builder.age;
		this.hobby = builder.hobby;
		this.address = builder.address;
		this.birthday = builder.birthday;
		this.job = builder.job;
		
		
	}

	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + ", hobby=" + hobby + ", address=" + address + ", birthday="
				+ birthday + ", job=" + job + "]";
	}

}



'개발 > Java' 카테고리의 다른 글

String #2 객체 비교  (0) 2016.06.03
Java String #1  (0) 2016.05.30
Static factory method  (0) 2016.05.01
Spring Value Annotation 사용시 참고 사항  (0) 2016.04.17
디자인 패턴 - Decorator, Adapter, Facade 패턴  (0) 2016.04.04
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함