빌더 패턴이란?
복잡한 단계가 필요한 인스턴스 생성을 빌더 패턴을 통해서 구현할 수 있다.
실습 (1)
서브 클래스에게 넘겨서 인스턴스를 생성
기본 Structure
Factory 생성
- 구현할 클래스에 대한 추상 클래스 정보를 가지고 있다.
- 전달받은 인스턴스 (구현할 클래스)에 따라서 해당 클래스의 구현 로직에 맞게 값을 주입한다.
아래 코드에서는 추상 클래스 정보는 BluePrint
해당 추상 클래스를 구현하는 하위 클래스를 아규먼트로 전달받아서 값을 주입한다.
/**
* Project : EffectiveStudy
*
* @author : jwdeveloper
* @comment :
* Time : 9:06 오후
*/
public class ComputerFactory {
private BluePrint bluePrint;
public void setBlueprint(BluePrint blueprint) {
this.bluePrint = blueprint;
}
public void make() {
bluePrint.setRam();
bluePrint.setCpu();
bluePrint.setStorate();
}
public Computer getComputer() {
return bluePrint.getComputer();
}
}
추상 클래스 생성 : 추상 메서드 생성
/**
* Project : EffectiveStudy
*
* @author : jwdeveloper
* @comment :
* Time : 9:03 오후
*/
public abstract class BluePrint {
abstract void setCpu();
abstract void setRam();
abstract void setStorate();
abstract Computer getComputer();
}
구현 클래스 생성
- 구현 클래스의 리턴 값은 Computer이다.
- Computer 클래스는 구현 클래스에 대한 정보를 포함하고 있다.
/**
* Project : EffectiveStudy
*
* @author : jwdeveloper
* @comment :
* Time : 9:05 오후
*/
public class LgGramBlueprint extends BluePrint{
private String cpu;
private String ram;
private String storage;
@Override
public void setCpu() {
this.cpu = "i7";
}
@Override
public void setRam() {
this.ram = "8g";
}
@Override
public void setStorate() {
this.storage = "256G SSD";
}
@Override
public Computer getComputer() {
return new Computer(cpu,ram,storage);
}
}
DTO 생성
/**
* Project : EffectiveStudy
*
* @author : jwdeveloper
* @comment :
* Time : 8:25 오후
*/
public class Computer {
private String cpu;
private String ram;
private String storage;
public Computer(String cpu, String ram, String storage) {
this.cpu = cpu;
this.ram = ram;
this.storage = storage;
}
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
public String getRam() {
return ram;
}
public void setRam(String ram) {
this.ram = ram;
}
public String getStorage() {
return storage;
}
public void setStorage(String storage) {
this.storage = storage;
}
@Override
public String toString() {
return "Computer{" +
"cpu='" + cpu + '\'' +
", ram='" + ram + '\'' +
", storage='" + storage + '\'' +
'}';
}
}
실습 (2)
많은 인자를 가진 객체의 생성을 다른 객체의 도움으로 생성하는 패턴
코드의 특징은 아래와 같이 Chaining 구조로 이루어져 있다.
public class Main {
public static void main(String[] args) {
Computer computer = ComputerBuilder
.start()
.setCpu("i7")
.setRam("8g")
.setStorage("256G SSD")
.build();
System.out.println(computer.toString());
}
}
Builder 클래스 작성
/**
* Project : EffectiveStudy
*
* @author : jwdeveloper
* @comment :
* Time : 9:44 오후
*/
public class ComputerBuilder {
private final Computer computer;
private ComputerBuilder() {
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.setCpu(ram);
return this;
}
public ComputerBuilder setStorage(String storage) {
computer.setStorage(storage);
return this;
}
public Computer build() {
return this.computer;
}
}
실습 (3) - Computer 클래스 없애고 내부 static 클래스로 해결
/**
* Project : EffectiveStudy
*
* @author : jwdeveloper
* @comment :
* Time : 9:44 오후
*/
public class ComputerBuilder {
private final String cpu;
private final String ram;
private final String storage;
public static class Builder {
private String cpu = "default";
private String ram = "default";
private String storage = "default";
public Builder cpu(String val1) {
cpu = val1;
return this;
}
public Builder ram(String val2) {
ram = val2;
return this;
}
public Builder storage(String val3) {
storage = val3;
return this;
}
public ComputerBuilder build() {
return new ComputerBuilder(this);
}
}
public ComputerBuilder(Builder builder) {
this.cpu = builder.cpu;
this.ram = builder.ram;
this.storage = builder.storage;
}
@Override
public String toString() {
return "ComputerBuilder{" +
"cpu='" + cpu + '\'' +
", ram='" + ram + '\'' +
", storage='" + storage + '\'' +
'}';
}
}
References
https://jwdeveloper.tistory.com/24
'CS > DesignPattern' 카테고리의 다른 글
(DesignPattern) 브릿지 패턴 (0) | 2020.05.17 |
---|---|
(DesignPattern) 추상팩토리 메서드 패턴 (0) | 2020.05.16 |
(DesignPattern) 프로토타입 패턴 (0) | 2020.05.04 |
(DesignPattern) 싱글턴 패턴 (0) | 2020.05.02 |
(DesignPattern) 팩토리메서드 패턴 (0) | 2020.04.22 |