Builder Pattern 따라해보기~~!!

엉금엉금·2022년 7월 15일
0

오늘 만난 문제

목록 보기
15/24

빌더 패턴 따라라도 쳐보는 이유

  • 일단 뭐라도 해보려고! 안하는 것보단 나아서!! 노력의 시간이 모이고 모여 보템이 되지 않을까 싶어 유튭에 나와있는 강의를 보면서 우선 따라쳐보려 한다.

  • 참고하는 유튭 영상 (클릭!)이다. 이것도 보고, 다른 글들도 살펴보면서 빌더 패턴에 대해서 최소 감이라도 익히려고 한다. 우선 오늘은 영상 두 개 따라치면서 감이라도 얻으려 한다.

빌더 패턴은 어떻게 함?

  • 복잡한 단계를 거쳐야 생성되는 객체의 구현을 서브 클래스에게 넘겨 설정함
  • 뭔말인지 모르겠쥬? 그냥 어떻게 만들어지는가 따라가봅시다!

생성자를 이용한 객체 생성의 단점

public static void main(String[] args) {
        Computer computer = new Computer("i7", "16g", "256g ssd");
        System.out.println(computer);
    }
public class MyClass {
	private String  A;
    private String  B;
    .
    .
    .
    private String  Z;
}
MyClass A = new MyClass("A", "B", "C", "D", "E", "F", "G", "H", ... "X", "Y", "Z");
  • Computer라는 객체는 cpu, ram, storage 3개의 instance variable을 갖는다. 그런데 한두개가 아닌 필드가 추가 된다면 생성자는 어떻게 되어야 하는 것일까? 아마 복잡해질 것이다.

객체 생성을 다른 객체에게 맡기자!

  • 메인 메서드 실행
public static void main(String[] args) {

        // factory는 Director, 컴퓨터를 만들어 주는 애
        ComputerFactory factory = new ComputerFactory();

        // Director는 BluePrint 라는 설계도를 가지고 있음
        // LgGramBlueprint 는 ConcreteBuilder
        factory.setBlueprint(new LgGramBlueprint());
        
        factory.make();

		Computer computer1 = factory.getComputer();
    }

factory라는 객체를 통해서 Computer 객체를 생성할 수 있다. 아래에 위의 구현에 필요한 다른 클래스들이 있다.

  • ComputerFactory Class
  • BluePrint라는 Abstract Class 변수를 멤버로 갖으며 해당 멤버는 Computer라는 변수를 갖고 있다.
  • make라는 메서드를 이용하여 Computer의 cpu, ram, stotrage를 set하고 getComputer를 통해 Computer객체를 얻을 수 있다.
public class ComputerFactory {

    private BluePrint print;

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

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

    public Computer getComputer() {
        return print.getComputer();
    }
}
  • BluePrint 추상 클래스
public abstract class BluePrint {
    abstract public void setCpu();
    abstract public void setRam();
    abstract public void setStorage();
    abstract Computer getComputer();
}
  • LgGramBlueprint 클래스
public class LgGramBlueprint extends BluePrint{

    private Computer computer;

    public LgGramBlueprint() {
        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
    Computer getComputer() {
        return computer;
    }
}
  • Computer라는 객체의 instance variable이 많아지면 객체를 생성이 복잡해질 수 있다.
  • 하지만 빌더 패턴을 이용하면 복잡하게 생성되어야 하는 객체를 보기 좋게 생성할 수 있도록 다른 객체에게 책임을 떠넘겨서 사용할 수 있다. 이 내용은 책에서 볼 수 있는 빌더 패턴의 내용이라 한다.

그렇다면 실무에서 사용하는 빌더 패턴은?

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

  • 많은 인자를 가진 객체의 생성을 다른 객체의 도움으로 생성할 수 있음

  • 메인 함수

public static void main(String[] args) {

        Computer computer = ComputerBuilder
                .start()
                .setCpu("i7")
                .setRam("16g")
                .setStorage("256g ssd")
                .build();

        System.out.println(computer);
}
  • ComputerBuilder
public class ComputerBuilder {

    private Computer computer;

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

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

    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;
    }
}

나는 Spring을 사용하면서 @Builder라는 어노테이션을 생성자에 붙여 사용했다. 제공하는 기능이 아닌 실제 어떻게 되는지 따라쳐보며 빌더 패턴을 알아보았다. 참고로 빌더 패턴을 통해서 아래와 같은 이점을 얻을 수 있다고 한다.

가독성
값 생성 유연함
필요한 값만 담음
객체의 불변성

이해를 통해 적절한 사용타이밍에 대해 좀 더 알고 융통성있게 해당 패턴을 사용할 수 있게 해야할 것 같다!

profile
step by step

0개의 댓글