일단 뭐라도 해보려고! 안하는 것보단 나아서!! 노력의 시간이 모이고 모여 보템이 되지 않을까 싶어 유튭에 나와있는 강의를 보면서 우선 따라쳐보려 한다.
참고하는 유튭 영상 (클릭!)이다. 이것도 보고, 다른 글들도 살펴보면서 빌더 패턴에 대해서 최소 감이라도 익히려고 한다. 우선 오늘은 영상 두 개 따라치면서 감이라도 얻으려 한다.
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");
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 객체를 생성할 수 있다. 아래에 위의 구현에 필요한 다른 클래스들이 있다.
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();
}
}
public abstract class BluePrint {
abstract public void setCpu();
abstract public void setRam();
abstract public void setStorage();
abstract Computer getComputer();
}
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;
}
}
많은 변수를 가진 객체의 생성을 가독성 높도록 코딩할 수 있음
많은 인자를 가진 객체의 생성을 다른 객체의 도움으로 생성할 수 있음
메인 함수
public static void main(String[] args) {
Computer computer = ComputerBuilder
.start()
.setCpu("i7")
.setRam("16g")
.setStorage("256g ssd")
.build();
System.out.println(computer);
}
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라는 어노테이션을 생성자에 붙여 사용했다. 제공하는 기능이 아닌 실제 어떻게 되는지 따라쳐보며 빌더 패턴을 알아보았다. 참고로 빌더 패턴을 통해서 아래와 같은 이점을 얻을 수 있다고 한다.
가독성
값 생성 유연함
필요한 값만 담음
객체의 불변성
이해를 통해 적절한 사용타이밍에 대해 좀 더 알고 융통성있게 해당 패턴을 사용할 수 있게 해야할 것 같다!