[Java] 점층적 생성자 패턴 ,자바 빈즈 패턴 ,빌더 패턴

해니·2023년 5월 26일
0

Java

목록 보기
4/34
post-thumbnail



점층적 생성자 패턴 (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);
}






자바 빈즈(Java Beans) 패턴

  • 점층적 생성자 패턴의 단점을 보완하기 위해 고안된 생성 패턴
  • 매개변수가 없는 생성자로 객체 생성후 Setter 메소드를 이용해 클래스 필드의 초깃값을 설정하는 방식
  • 장점
    • 인스턴스를 만들기 쉽다.
    • 가독성이 좋다.
  • 단점
    • 객체 하나를 만들기 위해서 메서드를 여러 개 호출해야 한다.
    • 일관성(consistency) 문제
      • 객체를 생성하는 부분과 값을 설정하는 부분이 물리적으로 떨어져 있어서 발생하는 문제점
      • 객체를 완성하는 동안 객체의 일관성이 보장되지 않는다.
    • 불변성(immutable) 문제
      • 객체를 완성한 뒤에도 setter() 를 외부에서 사용 가능하기 때문에 내용이 변경될 여지가 존재한다.

예시 코드

class Hamburger {
    // 필수 매개변수
    private int bun;
    private int patty;

    // 선택 매개변수
    private int cheese;
    private int lettuce;
    private int tomato;
    private int bacon;
    
    public Hamburger() {}

    public void setBun(int bun) {
        this.bun = bun;
    }

    public void setPatty(int patty) {
        this.patty = patty;
    }

    public void setCheese(int cheese) {
        this.cheese = cheese;
    }

    public void setLettuce(int lettuce) {
        this.lettuce = lettuce;
    }

    public void setTomato(int tomato) {
        this.tomato = tomato;
    }

    public void setBacon(int bacon) {
        this.bacon = bacon;
    }
}

호출 방식

public static void main(String[] args) {
    // 모든 재료가 있는 햄버거
    Hamburger hamburger1 = new Hamburger();
    hamburger1.setBun(2);
    hamburger1.setPatty(1);
    hamburger1.setCheese(2);
    hamburger1.setLettuce(4);
    hamburger1.setTomato(6);
    hamburger1.setBacon(8);

    // 빵과 패티 치즈만 있는 햄버거
    Hamburger hamburger2 = new Hamburger();
    hamburger2.setBun(2);
    hamburger2.setPatty(1);
    hamburger2.setCheese(2);

    // 빵과 패티 베이컨만 있는 햄버거
    Hamburger hamburger3 = new Hamburger();
    hamburger3.setBun(2);
    hamburger2.setPatty(1);
    hamburger3.setBacon(8);
}





빌더 패턴(Builder Pattern)

  • 복잡한 객체의 생성 과정과 표현 방법을 분리하여 다양한 구성의 인스턴스를 만드는 생성 패턴
  • 생성자에 들어갈 매개 변수를 메서드로 하나하나 받아들이고 마지막에 통합 빌드해서 객체를 생성하는 방식
  • 별도의 Builder 클래스 를 만들어 메소드를 통해 step-by-step 으로 값을 입력받은 후에 최종적으로 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();
}









출처
빌더(Builder) 패턴 - 완벽 마스터하기 https://inpa.tistory.com/entry/GOF-%F0%9F%92%A0-%EB%B9%8C%EB%8D%94Builder-%ED%8C%A8%ED%84%B4-%EB%81%9D%ED%8C%90%EC%99%95-%EC%A0%95%EB%A6%AC
[디자인 패턴] 점층적 생성자 패턴 (Telescoping Constructor Pattern)
JavaBeans Pattern이 뭐야 https://velog.io/@dhwlddjgmanf/JavaBeans-Pattern%EC%9D%B4-%EB%AD%90%EC%95%BC-lq9cyh9a

profile
💻 ⚾️ 🐻

0개의 댓글