본문 바로가기
public void static main()/Design Pattern

[Design Pattern] Builder Pattern

by 햄리뮤 2021. 11. 9.
반응형

아~ 패턴 왜이렇게 많아 솔직히 만드신분도 다 못외울꺼같아~

 

https://refactoring.guru/design-patterns/builder

Builder Pattern?

  • 복잡한 객체를 생성하는 클래스 와 표현하는 클래스를 분리하는 것!
  • 동일한 절차에서도 서로 다른 표현을 생성하는 방법을 제공!

다시 말해서

  • 객체의 생성 단계들을 캡슐화 하여 객체의 생성을 유연하게 해주는 패턴!
  • 객체의 생성과정과 객체의 표현 방법을 분리!

[구조]

  • Builder(건축자)의 역할
    • 인스턴스 생성을 위한 인터페이스(API)를 선언!
  • ConcreteBuilder(구체적인 건축자)의 역할
    • Builder 인터페이스를 구현하는 역할
  • Director(감독자)의 역할
    • Builder 인터페이스(API)를 사용해 인스턴스를 사용
  • Product(제품)의 역할
    • 만들어질 제품의 속성과 기능을 가짐

https://www.patrickschadler.com/builder-design-pattern/
https://refactoring.guru/design-patterns/builder

[구현]

// 제품을 필드로 가지며 객체 생성시 필요한 메소드를 선언하는 추상 클래스입니다.
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);
  }
}

[결론]

객체의 생성 과정과 객체의 표현 방법을 분리하여 사용함으로써 객체 생성이 가능해짐

https://refactoring.guru/design-patterns/builder

끝난줄 알았지? 근데 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

** 그냥 하루하루 개인 공부한 것을 끄적 거리는 공간입니다.

이곳 저곳에서 구글링한 것과 강의 들은

내용이 정리가 되었습니다.

그림들은 그림밑에 출처표시를 해놓았습니다.

문제가 될시 말씀해주시면 해당 부분은 삭제 하도록하겠습니다. **

반응형

댓글