반응형
1. 빌더 패턴이란?
선택적인 파라미터가 많을수록 파라미터의 제공 상태를 일관성있게 해주고(어떤 파라미터를 제공하는지, null인지) 최종적으로 생성된 객체를 return하는 패턴
2. 예시
만약 다음과 같은 UserInfo 클래스가 있다고 할때 생성자를 통해 객체를 생성하게 될때 파라미터의 개수가 많거나 Null이거나 하는경우 어떠한 파라미터를 제공하는지 알아보기도 힘들고 객체 생성이 용이하지않음.
public class UserInfo {
private String name;
private int age;
public UserInfo(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void getUserInfo() {
System.out.println(name, age);
}
}
따라서 빌더패턴을 적용해보면 다음과 같다. 아래와 같이 set을 통해 변수값을 지정하고 build를 통해 객체를 생성하는 방식이다. 사용자는 set을 통해 파라미터값을 정하기 때문에 생성자 방식처럼 순서에 맞게 작성하지 않아도 된다는 장점이 있고 예시는 클래스를 따로 나눴지만 내부 클래스를 이용해 하나의 클래스처럼 이용할 수 있다.
public class UserInfoBuilder {
private String name;
private int age;
public UserInfoBuilder setName(String name) {
this.name = name;
return this;
}
public UserInfoBuilder setAge(int age) {
this.age = age;
return this;
}
public UserInfo build() {
return new UserInfo(name, age);
}
}
UserInfoBuilder userInfoBuilder = new UserInfoBuilder();
UserInfo userInfo3 = userInfoBuilder.setName("테스터3").setAge(26).build();
롬복을 이용하게 되면 @Builder 어노테이션으로 같은 기능을 수행하여 코드량을 줄일 수 있다.
3. 추상 팩토리 패턴과 빌더패턴의 차이
앞서 나온 추상팩토리 패턴과 빌더패턴 모두 객체를 생성하는 관점에서 비슷하게 느껴질 수 있으나, 다음과 같은 차이가 있다.
추상팩토리는 제품의 최종단계가 아닌 원재료 즉 전체를 위한 하위객체를 바로 리턴하고,
public class NYPizzaingredientFactory implements PizzaIngredientFactory{
@Override
public Dough createDough() {
return new ThinCrustdough();
}
@Override
public Sauce createSauce() {
return new MarinaraSauce();
}
}
빌더 패턴은 정보가 합쳐진 최종 객체를 반환한다는 특징이 있다.
쉽게 생각해서 빌더패턴은 최종 결과물을 사용자가 받아보게 되고, 팩토리 패턴은 최종 결과물에 필요한 객체를 받아보게 된다.
반응형
'프로그래밍 > 시큐어코딩' 카테고리의 다른 글
[Spring] @Async와 completablefuture란? (0) | 2020.07.27 |
---|---|
[디자인 패턴] 템플릿 메소드 패턴 (0) | 2020.07.15 |
[디자인 패턴] 퍼사드 패턴 (0) | 2020.07.14 |
[디자인 패턴] 어댑터 패턴 (0) | 2020.07.14 |
[디자인 패턴] 커맨드 패턴 (0) | 2020.07.13 |