# 설명
객체를 생성(인스턴스화)하는 정통적인 방법은 두가지가 있다.
- 생성자
// 생성자
class User {
private String name;
private String id;
private String pwd;
User(String name){
this.name = name;
}
User(String name, String id){
this.name = name;
this.id = id;
}
User(String name, String id, String pwd){
this.name = name;
this.id = id;
this.pwd = pwd;
}
}
- setter를 사용한 java beans 패턴
// 생성자
class User {
private String name;
private String id;
private String pwd;
public void setName(String name){
this.name = name;
}
public void setId(String id){
this.id = id;
}
public void setPwd(String pwd){
this.pwd = pwd;
}
}
두가지 방법은 우리가 흔히 사용하던 방법이다. 각각의 생성 방식에는 문제점이 존재한다.
생성자 생성방식에서는
- 프로퍼티가 많아질 경우 그만큼의 프로퍼티를 만들어야 한다.
- 프로퍼티가 많아질 경우 인자의 순서가 헷갈린다.
setter 방식에서는
- setter가 존재하기 때문에 프로퍼티가 가변적이다. 즉 언제든 User객체의의 프로퍼티를 setter를 통해서 바꿀 수 있다.
객체의 생성결정이 한번에 일어나지 않는다.
이러한 문제를 해결하기 위해 빌더패턴(Builder)가 존재한다.
빌더 패턴을 간단히 설명하면 빌더를 통해 인자를 결정하고 build키워드를 통해 최종적으로 생성하고 싶은 객체를 인스턴스화 시킨다.
여러가지 프로퍼티를 만들 필요도 없으며, 인자의 순서를 헷갈려하지 않아도 된다. 또한 불변성(immutable)을 지니게 할 수 있다. 나아가 필수 생성인자와 옵셔널한 인자를 생성하게 할 수 있다.
빌더는 클래스내 스태틱(static) 클래스로 만들어, builder자체를 만들지 않고도 생성할 수 있게 해준다.
# 코드
package builder;
public class User {
private String name;
private int age;
private String nickname;
private String id;
private String pwd;
private User(Builder builder){
this.name = builder.name;
this.age = builder.age;
this.nickname = builder.nickname;
this.id = builder.id;
this.pwd = builder.pwd;
}
@Override
public String toString() {
return "name : " + name + "\nage : " + age + "\nnickname : " + nickname + "\nid : " + id + "\npwd : " + pwd;
}
public static class Builder{
private String name;
private int age;
private String nickname;
private String id;
private String pwd;
public Builder name(String name) {
this.name = name;
return this;
}
public Builder age(int age) {
this.age = age;
return this;
}
public Builder nickname(String nickname) {
this.nickname = nickname;
return this;
}
public Builder id(String id) {
this.id = id;
return this;
}
public Builder pwd(String pwd) {
this.pwd = pwd;
return this;
}
public User build(){
return new User(this);
}
}
}
# 테스트
package builder;
public class Test {
public static void main(String[] args) {
User hojun = new User.Builder()
.name("hojun")
.nickname("hacker")
.id("testId_123")
.age(24)
.pwd("password123")
.build();
System.out.println(hojun);
System.out.println("======@@@@@======");
User bob = new User.Builder()
.name("bob")
.id("bobtree1")
.pwd("bob1234")
.build();
System.out.println(bob);
}
}
'• 독서 > Design Pattern' 카테고리의 다른 글
[디자인패턴-위임/팩토리패턴] 팩토리 메소드 패턴 (Factory-Method Pattern) (2) | 2022.09.20 |
---|---|
[디자인패턴-위임패턴] 템플릿 메서드 패턴(Template Method) (0) | 2022.09.18 |
[디자인패턴-생성패턴] 추상팩토리 패턴(Abstract-Factory pattern) (0) | 2022.09.17 |
[디자인패턴-생성패턴] 프로토타입 패턴(Prototype Pattern) (0) | 2022.09.16 |
[디자인패턴-생성패턴] 싱글톤 패턴(Singleton Pattern) (0) | 2022.09.16 |