티스토리 뷰

반응형

총 두 가지 방식을 보면서 빌더 패턴을 공부해보자.

1. 빌더 패턴(1) : 객체의 구현을 서브 클래스에게 넘겨줘 인스턴스를 생성하는 패턴

2. 빌더 패턴(2) : 다른 객체의 도움으로 인스턴스를 생성하는 패턴(체인 방식)

 

빌더 패턴 (1)

복잡한 단계가 필요한 인스턴스 생성을 빌더 패턴을 통해서 구현가능하다.

복잡한 단계를 거쳐야 생성되는 객체의 구현을 서브 클래스에게 넘겨주는 패턴

 

기본 설계

image

 

 

예제 설계

image

 

 

소스 확인

//Factory
public class ComputerFactory {
  private BluePrint print;

  public void setBlueprint(BluePrint blueprint) {
    this.print = blueprint;
  }

  public void make() {
    print.setCpu();
    print.setRam();
    print.setStorage();
  }

  public Computer getComputer() {
    return print.getComputer();
  }
}

//Blue Print
public abstract class BluePrint {
  abstract public void setCpu();
  abstract public void setRam();
  abstract public void setStorage();

  abstract public Computer getComputer();
}

//LG Gram
public class LgGramBluePrint extends BluePrint {

  //computer 참조
  private Computer computer;

  public LgGramBluePrint() {
    this.computer = new Computer("default", "default", "default");
  }

  @Override
  public void setCpu() {
    computer.setCpu("i7");
  }

  @Override
  public void setRam() {
    computer.setRam("8G");
  }

  @Override
  public void setStorage() {
    computer.setStorage("256G SSD");
  }

  @Override
  public Computer getComputer() {
    return computer;
  }
}

//Computer
public class Computer {
  private String cpu;
  private String ram;
  private String storage;

  //getter/setter
  ...
}

//Main
public static void main(String[] args) {
  ComputerFactory factory = new ComputerFactory();
  factory.setBlueprint(new LgGramBluePrint());
  //factory.setBlueprint(new SonyBluePrint());

  factory.make();
  Computer computer = factory.getComputer();

  System.out.println(computer.toString());

}

computer의 추가적인 속성이 필요로 하거나 필요한 속성만 가지고 있는 클래스를 만들고 싶을 땐, make()의 변경 혹은 factory에 메소드를 추가하여 요구사항에 대한 복잡한 인스턴스 생성을 쉽게 진행할 수 있는 것이다.

 

 

 

빌더 패턴 (2)

많은 변수를 가진 객체의 생성을 가독성 높도록 코딩할 수 있다.

많은 인자를 가진 객체의 생성을 다른 객체의 도움으로 생성하는 패턴이다.

복잡한 객체를 생성하는 방법과 표현하는 방법을 정의하는 클래스를 별도로 분리하여 서로 다른 표현이라도 이를 생성할 수 있는 동일한 구축 공정을 제공할 수 있도록 한다.

 

 

일반방식의 객체 생성

public static void main(String[] args) {
  Computer computer = new Computer("i7", "8g", "256g ssd");
}

일반 방식의 객체를 생성했을 때는 Computer 클래스에 모든 속성값을 필수적으로 넣고 파라미터 순서도 기억한 후 넣어야한다. 지금은 세개의 속성밖에 없지만 추 후 매우 많은 속성값이 필요할 시에는 가독성과 매우 떨어지게 되고 속성을 빼먹는 경우도 발생할 것이다.

이를 개선하기 위해 나타난 것이 체인형 빌더 패턴 방식이다.

 

 

 

빌더 패턴 활용

//Computer
public class Computer {
  private String cpu;
  private String ram;
  private String storage;

  //getter/setter
  ...
}

//ComputerBuilder
public class ComputerBuilder {
    private Computer computer;
    private ComputerBuilder(){
        this.computer = new Computer("default", "default" , "default");
    }

    public static ComputerBuilder start() {
        return new ComputerBuilder();
    }

    //CPU를 시작과 동시에 넣겠다.
    public static ComputerBuilder startWithCpu(String cpu) {
        ComputerBuilder builder = new ComputerBuilder();
        builder.computer.setCpu(cpu);
        return builder;
    }

    public ComputerBuilder setCpu(String cpu) {
        computer.setCpu(cpu);
        return this;
    }

    public ComputerBuilder setRam(String ram) {
        computer.setRam(ram);
        return this;
    }

    public ComputerBuilder setStorage(String storage) {
        computer.setStorage(storage);
        return this;
    }

    public Computer build() {
        return this.computer;
    }
}

//Main
public static void main(String[] args) {
  Computer computer = ComputerBuilder
    .startWithCpu("i6")
    //.start()
    //.setCpu("i7")
    .setRam("8G")
    .build();

  System.out.println(computer.toString());
}

위 소스를 보았듯이, Main에서 인스턴스를 생성할 때 체인 형태로 생성하는 것을 볼 수 있을 것이다. 즉, Computer 클래스를 생성할 때 ComputerBuilder 클래스를 활용하여 체인 형태로 생성할 수 있어 개발자에게는 매우 간편하게 인스턴스를 생성할 수 있다.

이를 활용할 시에는 속성을 빼먹어도 정상적으로 인스턴스가 생성되고, 개발자는 필수적인 속성만 알고 있고, 속성을 넣는 순서를 모르더라도 컴파일 오류를 맞닥드릴 일은 발생하지 않을 것이다.

현업에서도 매우 많이 활용하고 있는 패턴이니 꼭 알고 지나가야 할 것이다.

 

 

 

 

 

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함