합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴
// 예시문제
// StudentDao 클래스
public class StudentDao {
private static List<Student> students = new ArrayList();
public StudentDao() {}
static { // Main문보다 Static 영역 먼저 실행
for(int i=0; i<100; i++) {
// 빌더패턴으로 이용해서 객체를 생성해보자 (만들고 싶은 타입으로 객체생성 가능)
students.add(Student.builder()
.stdNo(i+1)
.name("test"+i)
.age((int)(Math.random()*50)+10)
.height(Math.random()*(190-150)+150)
.gender(i%2==0 ? Gender.M : Gender.F)
.address("test"+i)
.build());
}
}
public static List<Student> getStudents(){
return StudentDao.students;
}
//StreamController
public static void main(String[] args) {
//Builder 패턴으로 객체 생성하기
Student s = new Student();
s = Student.builder()
.stdNo(1)
.name("유병승")
.age(19)
.height(180.5)
.gender(Gender.M)
.address("경기도 시흥시")
.build(); // 리턴값 Student로 받음
//이름하고 번호만 만들고 싶을 때
s = Student.builder().stdNo(2).name("최주영").build();
System.out.println(s);
}
// Student
public class Student {
private long stdNo;
private String name;
private int age;
private double height;
private Gender gender; // M,f
private String address;
public Student() {}
public Student(long stdNo, String name, int age, double height, Gender gender, String address) {
super();
this.stdNo = stdNo;
this.name = name;
this.age = age;
this.height = height;
this.gender = gender;
this.address = address;
}
public long getStdNo() {
return stdNo;
}
public void setStdNo(long stdNo) {
this.stdNo = stdNo;
}
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 double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public Gender getGender() {
return gender;
}
public void setGender(Gender gender) {
this.gender = gender;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
// Gender 클래스
public enum Gender { // 상수로 구성된 enum 클래스
M,F
}
//빌더 패턴으로 클래스 생성하는 로직 구현하기
//내부 클래스를 활용하여 구현함.
public static class Builder{ // 내부 클래스 생성
private long stdNo;
private String name;
private int age;
private double height;
private Gender gender;
private String address;
public Builder stdNo(long val) {
stdNo = val;
return this;
}
public Builder name(String val) {
name = val;
return this;
}
public Builder age(int val) {
age = val;
return this;
}
public Builder height(double val) {
height = val;
return this;
}
public Builder gender(Gender val) {
gender = val;
return this;
}
public Builder address(String val) {
address = val;
return this;
}
public Student build() { // Builder에 값 다 넣고 마지막에 build 호출
return new Student(stdNo,name,age,height,gender,address);
}
}
public static Student.Builder builder() {
return new Student.Builder();
}
}