μ½νλ¦°μμλ νμ μλ Builder ν¨ν΄μ΄ μλ°λ₯Ό μ¬μ©νλ©΄μ νμνλ€κ³ μκ°μ΄ λ€μλ€.
ν λΈλ‘κ·Έμμ Builder ν¨ν΄μ λν΄μ λΉλ ν¨ν΄μ κ΅μ₯ν μ λ€λ£¨μ΄ μ€λͺ μ ν΄μ£Όμ΄ μ΄ν΄νκΈ° μ½κ³ μ 리νκ³ μ΄ν΄νλ κ²μΌλ‘ μ§μ€νλ€.
μ²μ²ν μ½μΌλ©΄μ μ λ¦¬ν΄ λ³΄μ.
μ μΈ΅μ μμ±μ ν¨ν΄(Telescoping Constructor Pattern)μ νμ 맀κ°λ³μμ ν¨κ» μ ν 맀κ°λ³μλ₯Ό 0κ°, 1κ°, 2κ° .. λ°λ ννλ‘, μ°λ¦¬κ° λ€μν 맀κ°λ³μλ₯Ό μ λ ₯λ°μ μΈμ€ν΄μ€λ₯Ό μμ±νκ³ μΆμλ μ¬μ©νλ μμ±μλ₯Ό μ€λ²λ‘λ© νλ λ°©μμ΄λ€.
class Hamburger {
// νμ 맀κ°λ³μ
private int bun;
private int patty;
// μ ν 맀κ°λ³μ
private int cheese;
private int lettuce;
private int tomato;
private int bacon;
public Hamburger(int bun, int patty, int cheese, int lettuce, int tomato, int bacon) {
this.bun = bun;
this.patty = patty;
this.cheese = cheese;
this.lettuce = lettuce;
this.tomato = tomato;
this.bacon = bacon;
}
public Hamburger(int bun, int patty, int cheese, int lettuce, int tomato) {
this.bun = bun;
this.patty = patty;
this.cheese = cheese;
this.lettuce = lettuce;
this.tomato = tomato;
}
public Hamburger(int bun, int patty, int cheese, int lettuce) {
this.bun = bun;
this.patty = patty;
this.cheese = cheese;
this.lettuce = lettuce;
}
public Hamburger(int bun, int patty, int cheese) {
this.bun = bun;
this.patty = patty;
this.cheese = cheese;
}
...
}
public static void main(String[] args) {
// λͺ¨λ μ¬λ£κ° μλ νλ²κ±°
Hamburger hamburger1 = new Hamburger(2, 1, 2, 4, 6, 8);
// λΉ΅κ³Ό ν¨ν° μΉμ¦λ§ μλ νλ²κ±°
Hamburger hamburger2 = new Hamburger(2, 1, 1);
// λΉ΅κ³Ό ν¨ν° λ² μ΄μ»¨λ§ μλ νλ²κ±°
Hamburger hamburger3 = new Hamburger(2, 0, 0, 0, 0, 6);
}
νμ μ΄ λ€μν μλ‘ μμ±μ λ©μλ μκ° κΈ°νκΈμμ μΌλ‘ λμ΄λ κ°λ μ±μ΄λ μ μ§λ³΄μ μΈ‘λ©΄μμ μ’μ§ μλ€.
λΉλ ν¨ν΄μ μ΄λ¬ν λ¬Έμ λ€μ ν΄κ²°νκΈ° μν΄ λ³λμ Builder ν΄λμ€λ₯Ό λ§λ€μ΄ λ©μλλ₯Ό ν΅ν΄ step-by-step μΌλ‘ κ°μ μ
λ ₯λ°μ νμ μ΅μ’
μ μΌλ‘ build() λ©μλλ‘Β νλμ μΈμ€ν΄μ€λ₯Ό μμ±νμ¬ λ¦¬ν΄νλ ν¨ν΄μ΄λ€.
λΉλ ν¨ν΄ μ¬μ©λ²μ μ μ μ΄ν΄λ³΄λ©΄, StudentBuilder λΉλ ν΄λμ€μ λ©μλλ₯Ό 체μ΄λ(Chaining) ννλ‘ νΈμΆν¨μΌλ‘μ¨ μμ°μ€λ½κ² μΈμ€ν΄μ€λ₯Ό ꡬμ±νκ³ λ§μ§λ§μΒ build()Β λ©μλλ₯Ό ν΅ν΄ μ΅μ’
μ μΌλ‘ κ°μ²΄λ₯Ό μμ±νλλ‘ λμ΄μμμ λ³Ό μ μλ€.
public static void main(String[] args) {
// μμ±μ λ°©μ
Hamburger hamburger = new Hamburger(2, 3, 0, 3, 0, 0);
// λΉλ λ°©μ
Hamburger hamburger = new Hamburger.Builder(10)
.bun(2)
.patty(3)
.lettuce(3)
.build();
}
class Student {
private int id;
private String name = "μ무κ°";
private String grade = "freshman";
private String phoneNumber = "010-0000-0000";
public Student(int id, String name, String grade, String phoneNumber) {
this.id = id;
this.name = name;
this.grade = grade;
this.phoneNumber = phoneNumber;
}
@Override
public String toString() {
return "Student { " +
"id='" + id + '\'' +
", name=" + name +
", grade=" + grade +
", phoneNumber=" + phoneNumber +
" }";
}
}
class StudentBuilder {
private int id;
private String name;
private String grade;
private String phoneNumber;
public StudentBuilder id(int id) {
this.id = id;
return this;
}
public StudentBuilder name(String name) {
this.name = name;
return this;
}
public StudentBuilder grade(String grade) {
this.grade = grade;
return this;
}
public StudentBuilder phoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
return this;
}
public Student build() {
return new Student(id, name, grade, phoneNumber); // Student μμ±μ νΈμΆ
}
}
public static void main(String[] args) {
Student student = new StudentBuilder()
.id(2016120091)
.name("μκΊ½μ ")
.grade("Senior")
.phoneNumber("010-5555-5555")
.build();
System.out.println(student);
}
κ²°λ‘ μ κ°μ²΄λ₯Ό μμ±νλ λλΆλΆμ κ²½μ°μλ λΉλ ν¨ν΄μ μ μ©νλ κ²μ΄ μ’λ€.
@Builder
class Student {
private int id;
private String name = "μ무κ°";
private String grade = "freshman";
private String phoneNumber = "010-0000-0000";
}
public static void main(String[] args) {
Student student = new Student()
.id(2016120091)
.name("μκΊ½μ ")
.grade("Senior")
.phoneNumber("010-5555-5555")
.build();
}
μΆμ²: https://inpa.tistory.com/entry/GOF-π -λΉλBuilder-ν¨ν΄-λνμ-μ 리 [Inpa Dev π¨βπ»:ν°μ€ν 리]
μΆμ²: https://mangkyu.tistory.com/163 [MangKyu's Diary:ν°μ€ν 리]
μΆμ²: https://refactoring.guru/ko/design-patterns/builder [refactoring.guru]
λ©μ Έμ