빌더 패턴

김대익·2022년 3월 29일
0

만약 클래스가 변수를 많이 가지고 있어 인수가 여러개 있는 경우처럼
객체를 만드는 것이 복잡할 경우
빌더를 만들어 각 변수를 미리 저장해두어 편하게 객체를 만들게 해주는 패턴이다.

class Cat:
  def __init__(self,height,weight,color): #could be more props such as type,and more...
    self.height = height
    self.weight = weight
    self.color = color

  def print(self):
    return print(f"{self.height}cm,{self.weight}kg,{self.color}")

위와 같이 여러 인수를 받아야할 경우

class CatBuilder:
  def __init__(self):
    self.height = None
    self.weight = None
    self.color = None
    
  def setHeight(self,height):
    self.height = height
    return self
  
  def setWeight(self,weight):
    self.weight = weight
    return self
  def setColor(self,color):
    self.color = color
    return self

  def build(self):
    cat = Cat(self.height,self.weight,self.color)
    #building a cat can be very complex
    return cat

빌더에서 settter를 이용하여 각 인수를 미리 받고
객체를 생성할 수 있게 도와주는 패턴이다.

setter를 이용하는 것 뿐만아니라 light mode, dark mode같은 경우를 미리 저장해두는 방식으로도 만든다.

class WhiteCatBuilder(CatBuilder):
  def __init__(self):
    super().__init__()
    self.color = "white"

class BlackCatBuilder(CatBuilder):
  def __init__(self):
    super().__init__()
    self.color = "black"


white_cat = WhiteCatBuilder().setHeight(10).setWeight(10).build()
white_cat.print()
black_cat = BlackCatBuilder().setHeight(20).setWeight(20).build()
black_cat.print()


위키에서 보면 director도 있는데
이는 빌더의 인수를 설정하거나, light mode, dark mode등을 설정하여 빌드를 만들어주는 클래스이다.

#Director is not mandatory
class Director:
  def setSmallCat(self,builder:CatBuilder):
    builder.setWeight(5)
    builder.setHeight(5)


  def setBigCat(self,builder:CatBuilder):
    builder.setWeight(100)
    builder.setHeight(100)

JS 예제 코드를 보면

function Shop() {
    this.construct = function (builder) {
        builder.step1();
        builder.step2();
        return builder.get();
    }
}

function CarBuilder() {
    this.car = null;

    this.step1 = function () {
        this.car = new Car();
    };

    this.step2 = function () {
        this.car.addParts();
    };

    this.get = function () {
        return this.car;
    };
}

function TruckBuilder() {
    this.truck = null;

    this.step1 = function () {
        this.truck = new Truck();
    };

    this.step2 = function () {
        this.truck.addParts();
    };

    this.get = function () {
        return this.truck;
    };
}

function Car() {
    this.doors = 0;

    this.addParts = function () {
        this.doors = 4;
    };

    this.say = function () {
        console.log("I am a " + this.doors + "-door car");
    };
}

function Truck() {
    this.doors = 0;

    this.addParts = function () {
        this.doors = 2;
    };

    this.say = function () {
        console.log("I am a " + this.doors + "-door truck");
    };
}

function run() {
    var shop = new Shop();
    var carBuilder = new CarBuilder();
    var truckBuilder = new TruckBuilder();
    var car = shop.construct(carBuilder);
    var truck = shop.construct(truckBuilder);

    car.say();
    truck.say();
}

run() 함수를 보면 CarBuilder()와 TruckBuilder()에서 어떤 방식으로 객체를 생성할 지 정해놨기 때문에
내부의 세부사항을 알 필요 없이 객체를 생성하려면
shop.construct(carBuilder);
shop.construct(truckBuilder);만 사용할 줄 알면 된다.

0개의 댓글