아~ 패턴 왜이렇게 많아 솔직히 만드신분도 다 못외울꺼같아~
Builder Pattern?
- 복잡한 객체를 생성하는 클래스 와 표현하는 클래스를 분리하는 것!
- 동일한 절차에서도 서로 다른 표현을 생성하는 방법을 제공!
다시 말해서
- 객체의 생성 단계들을 캡슐화 하여 객체의 생성을 유연하게 해주는 패턴!
- 객체의 생성과정과 객체의 표현 방법을 분리!
[구조]
- Builder(건축자)의 역할
- 인스턴스 생성을 위한 인터페이스(API)를 선언!
- ConcreteBuilder(구체적인 건축자)의 역할
- Builder 인터페이스를 구현하는 역할
- Director(감독자)의 역할
- Builder 인터페이스(API)를 사용해 인스턴스를 사용
- Product(제품)의 역할
- 만들어질 제품의 속성과 기능을 가짐
[구현]
// 제품을 필드로 가지며 객체 생성시 필요한 메소드를 선언하는 추상 클래스입니다.
public abstract class Builder {
protected House house;
public void createHouse() {
house = new House();
}
public abstract void buildWalls();
public abstract void buildDoors();
public abstract void buildRoof();
public abstract void buildWindows();
public abstract House getHouse();
}
// 제품 클래스 입니다. 생성될 제품의 속성과 기능을 가집니다.
public class House {
private String roof;
private String doors;
private String windows;
private String walls;
public void setRoof(String roof) {
this.roof = roof;
}
public void setDoors(String doors) {
this.doors = doors;
}
public void setWindows(String windows) {
this.windows = windows;
}
public void setWalls(String walls) {
this.walls = walls;
}
@Override
public String toString() {
return "House{" +
"roof='" + roof + '\'' +
", doors='" + doors + '\'' +
", windows='" + windows + '\'' +
", walls='" + walls + '\'' +
'}';
}
}
// Builder 추상 클래스의 기능을 재정의
public class ConcreteHouseBuilder extends Builder{
@Override
public void buildWalls() {
house.setWalls("콘크리트");
}
@Override
public void buildDoors() {
house.setDoors("나무");
}
@Override
public void buildRoof() {
house.setRoof("보라색");
}
@Override
public void buildWindows() {
house.setWindows("KCC창문");
}
@Override
public House getHouse() {
return house;
}
}
// Builder을 속성으로 가지며, Builder클래스의 메소드를 사용해 객체를 생성하고, 반환해줍니다.
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public void build() {
builder.createHouse();
builder.buildWalls();
builder.buildDoors();
builder.buildRoof();
builder.buildWindows();
}
public House getHouse() {
return builder.getHouse();
}
}
public class BuilderApplication {
public static void main(String[] args) {
Builder concreteHouseBuilder = new ConcreteHouseBuilder();
Director director = new Director(concreteHouseBuilder);
director.build();
House house1 = director.getHouse();
System.out.println(house1);
Builder woodHouseBuilder = new WoodHouseBuilder();
director = new Director(woodHouseBuilder);
director.build();
House house2 = director.getHouse();
System.out.println(house2);
}
}
[결론]
객체의 생성 과정과 객체의 표현 방법을 분리하여 사용함으로써 객체 생성이 가능해짐
끝난줄 알았지? 근데 Builder Pattern은 여기서 끝이 아니야! 더 좋은게 있다구!
생성자 인자가 많을 경우 Builder Pattern 적용을 고려해야한다!
Builder Pattern은 객체 생성을 깔끔하고, 유연하게 할수 있는 방법이 있기 때문에!
[상황만들기]
Member 객체를 생성하려고 하는데 age 파라미터가 필요 없는 상황 또는 phone이 필요없거나 뭔가 하나씩 필요없는 상황일때 마다 생성자를 계속 만들기는 너모 힘들다...
public class Member {
private String lastName;
private String firstName;
private int age;
private String phone;
}
이때 롬복의 @Builder 애노테이션을 사용한다면! 아주 간단히 그리고 가독성 높게 사용할 수 있다!
@Builder
public class Member {
private String lastName;
private String firstName;
private int age;
private String phone;
}
아니 이렇게 간단하다니! 너모 편하자나!
public class BuilderApplication {
public static void main(String[] args) {
Member member = Member.builder()
.firstName("리마")
.lastName("킴")
.phone("11111111")
.build();
}
}
아~ 디자인패턴 햄많아~ 오늘도 저를 공부시켜주신 인터넷 멘토분들 너무너무 감사합니다!
이분들 아니였으면 두꺼운 책 사서 공부해야했다 ㅠㅠㅠ 힘두러
https://mangkyu.tistory.com/163
[Java] 빌더 패턴(Builder Pattern)을 사용해야 하는 이유
객체를 생성하기 위해서는 생성자 패턴, 정적 메소드 패턴, 수정자 패턴, 빌더 패턴 등을 사용할 수 있습니다. 개인적으로 객체를 생성할 때에는 반드시 빌더 패턴을 사용해야 한다고 생각하는
mangkyu.tistory.com
lee1535 블로거분 정리 진짜 잘해주셨다!
https://lee1535.tistory.com/104
[디자인패턴/Design Pattern] Builder 패턴 / 빌더 패턴
관련 내용은 [자바 언어로 배우는 디자인 패턴 입문] , [Head First Design Pattern] , [Effective Java 3 개정판] 의 내용을 참고해서 정리한 내용입니다. 잘못된 부분은 댓글로 피드백 부탁드립니다. 1. Builder.
lee1535.tistory.com
** 그냥 하루하루 개인 공부한 것을 끄적 거리는 공간입니다.
이곳 저곳에서 구글링한 것과 강의 들은
내용이 정리가 되었습니다.
그림들은 그림밑에 출처표시를 해놓았습니다.
문제가 될시 말씀해주시면 해당 부분은 삭제 하도록하겠습니다. **
'public void static main > Etc' 카테고리의 다른 글
[Design Pattern] Facade Pattern (0) | 2021.11.11 |
---|---|
[Design Pattern] Adapter Pattern (0) | 2021.11.10 |
[Design Pattern] Flyweight Pattern (0) | 2021.11.09 |
[Design Pattern] Observer Pattern (0) | 2021.11.07 |
[Design Pattern] Singleton Pattern (0) | 2021.11.02 |
댓글