[Design Pattern] Builder Pattern

CoHa·2020년 9월 4일
1

Builder Pattern

빌더패턴은 보통 객체를 생성하면서 많이 사용하게 되는 패턴이다.

빌더패턴은 필요한걸까?

예시

People 클래스가 존재하는데 이 클래스의 구성은 다음과 같다.

public class People {
	private String name;
	private int age;
	private String phoneNumber;
	private String sex;
	private String address;

	//getter, setter 생략

	public static PeopleBuilder builder() {
	    return new PeopleBuilder();
	}
}

(위 클래스에서 setter랑 getter는 존재하지만 생략했다.)

객체를 생성하려고 할 때 접근 제어자로 인해 우리는 객체를 생성하고 값을 입력하기 위해서는 Setter를 거쳐야 한다. 그렇기 때문에 객체를 생성할 때 멤버변수를 초기화 할 수 있는 생성자를 이용한다.

지금 Person 클래스는 멤버변수가 8개 밖에 없기 때문에, 반드시 필요로하는 멤버변수들을 오버로딩한 생성자를 여러 개 만들 때 큰 어려움이 없지만 다음과 같이 3개를 만드는 것도 힘들다.

	public People() {}
	
	public People(String name, int age, String phoneNumber) {
		this.name = name;
		this.age = age;
		this.phoneNumber = phoneNumber;
	}
	
	
	public People(String name, int age, String sex, String address) {
		this.name = name;
		this.age = age;
		this.sex = sex;
		this.address = address;
	}

멤버변수가 지금보다 조금만 더 늘어난다고 한다면 객체 생성을 위해 만들어야 하는 생성자의 개수는 어마어마할 것이다. 이러한 불편을 해결하기 위해서 사용하는 것이 바로 빌더패턴이다.

위와 같이 생성자를 통해서 객체를 생성했을 때와는 달리,

People people = People.builder()
                      .name("jun")
                      .Age(20)
                      .build();

생성자를 오버로딩하지 않아도 이러한 방식의 객체 생성이 가능해진 것이다.

Builder Pattern Code

public class PeopleBuilder {
	private String name;
	private int age;
	private String phoneNumber;
	private String sex;
	private String address;
	
	public PeopleBuilder name(String name) {
		this.name = name;
		return this;
	}

	public PeopleBuilder Age(int age) {
		this.age = age;
		return this;
	}

	public PeopleBuilder PhoneNumber(String phoneNumber) {
		this.phoneNumber = phoneNumber;
		return this;
	}

	public PeopleBuilder Sex(String sex) {
		this.sex = sex;
		return this;
	}

	public PeopleBuilder Address(String address) {
		this.address = address;
		return this;
	}
	
	public People build() {
		People people = new People();
		people.setName(name);
		people.setAge(age);
		people.setPhoneNumber(phoneNumber);
		people.setSex(sex);
		people.setAddress(address);
		return people;
	}	
}
profile
백엔드 개발을 좋아하는 주니어 개발자

0개의 댓글