빨간색코딩

Builder Pattern (빌더 패턴) 본문

디자인패턴

Builder Pattern (빌더 패턴)

빨간색소년 2018. 2. 25. 21:53

인스턴스를 생성할 때 파라미터가 많을 수록, 매우 많은 경우의 수가 생긴다. 파라미터A는 값이 들어있을수도, B는 안들어있을수도 있는 등등등. 이럴 경우 대응할 수 있는 방안이 내 생각에서는 아래와 같았다.

  1. 오버로딩으로 사용할 만한 경우마다 생성자를 생성한다.
  2. 하나의 생성자에서 파라미터를 그냥 null 로 넘긴다.

그런데 타인의 코드를 보던 도중 VO 에 빌더패턴을 적용한 것을 보았다..!

1. Builder 패턴은 왜 쓰는가?

위의 서문같은 경우를 해결할 수 있다. 또한 아래와 같은 장점들이 있다.

  • 인스턴스를 생성할 때 인자를 선택적으로 가독성 좋게 넘길 수 있다.
  • 인자의 순서에 상관이 없어진다.
  • 불필요한 생성자를 만들지 않는다.

2. 사용 예제

아래처럼 생성자를 멤버변수들을 나열해도 좋고, ComputerBulider 만 받아서 ComputerBulider.cpu 이런식으로 매핑해줘도 된다.

Computer.java

public class Computer {
    private int serialNumber;
    private String model;
    private String vender;
    private String cpu;
    private int ram;
    private int disk;
    private String graphicCard;
    
    private Computer(int serialNumber, String model, String vender, String cpu, int ram, int disk, String graphicCard) {
        super();
        this.serialNumber = serialNumber;
        this.model = model;
        this.vender = vender;
        this.cpu = cpu;
        this.ram = ram;
        this.disk = disk;
        this.graphicCard = graphicCard;
    }
    
    @Override
    public String toString() {
        return "Computer [serialNumber=" + serialNumber + ", model=" + model + ", vender=" + vender + ", cpu=" + cpu
            + ", ram=" + ram + ", disk=" + disk + ", graphicCard=" + graphicCard + "]";
    }

    public static class ComputerBulider {
        private int serialNumber;
        private String model;
        private String vender;
        private String cpu;
        private int ram;
        private int disk;
        private String graphicCard;
        
        public ComputerBulider setSerialNumber(int serialNumber) {
            this.serialNumber = serialNumber;
            return this;
        }
        public ComputerBulider setModel(String model) {
            this.model = model;
            return this;
        }
        public ComputerBulider setVender(String vender) {
            this.vender = vender;
            return this;
        }
        public ComputerBulider setCpu(String cpu) {
            this.cpu = cpu;
            return this;
        }
        public ComputerBulider setRam(int ram) {
            this.ram = ram;
            return this;
        }
        public ComputerBulider setDisk(int disk) {
            this.disk = disk;
            return this;
        }
        public ComputerBulider setGraphicCard(String graphicCard) {
            this.graphicCard = graphicCard;
            return this;
        }
        
        public Computer build() {
            Computer computer = new Computer(serialNumber, model, vender, cpu, ram, disk, graphicCard);
            return computer;
        }
    }
}

ComputerClient.java

public class ComputerClient {
    public static void main(String[] args) {
        Computer computer = new Computer.ComputerBulider()
            .setCpu("i9")
            .setDisk(256)
            .build();
        System.out.println(computer);
    }
}

결과 : Computer [serialNumber=0, model=null, vender=null, cpu=i9, ram=0, disk=256, graphicCard=null]

Comments