빌더 패턴

업데이트:

Builder Pattern

복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴. 복잡한 객체를 빌드하는 프로세스를 캡슐화 또는 숨기는 작업을 하고 해당 객체와 해당 구조의 표현을 분리한다.

이에 더해 생성자에 전달하는 인수에 의미를 부여할 수 있다.

생성자를 통해서 멤버를 생성하지 않고 내부 클래스(빌더)를 통해 생성한다.

Builder UML class diagram.svg

import abc
# Product
class Pizza(object):
    def setDough(self, dough):
        self.__dough = dough
    
    def setSauce(self, sauce):
        self.__sauce = sauce

    def setTopping(self, topping):
        self.__topping = topping

    def __repr__(self):
        return '\n'.join([self.__dough, self.__sauce, self.__topping])

# Abstract Builder
class PizzaBuilder(metaclass=abc.ABCMeta):
    def getPizza(self):
        return self._pizza
    
    def createNewPizzaProduct(self):
        self._pizza = Pizza()

    @abc.abstractmethod
    def buildDough(self):
        pass

    @abc.abstractmethod
    def buildSauce(self):
        pass

    @abc.abstractmethod
    def buildTopping(self):
        pass

# ConreteBuilder
class HawaiianPizzaBuilder(PizzaBuilder):
    def buildDough(self):
        self._pizza.setDough("cross")
    
    def buildSauce(self):
        self._pizza.setSauce("mild")

    def buildTopping(self):
        self._pizza.setTopping("ham + pineapple")

# ConreteBuilder
class SpicyPizzaBuilder(PizzaBuilder):
    def buildDough(self):
        self._pizza.setDough("pan baked")
    
    def buildSauce(self):
        self._pizza.setSauce("hot")

    def buildTopping(self):
        self._pizza.setTopping("pepperoni+salami")

# Director
class Cook(object):
    def setPizzaBuilder(self, pizzaBuilder):
        self.__pizzaBuilder = pizzaBuilder

    def getPizza(self):
        return self.__pizzaBuilder.getPizza()

    def constructPizza(self):
        self.__pizzaBuilder.createNewPizzaProduct()
        self.__pizzaBuilder.buildDough()
        self.__pizzaBuilder.buildSauce()
        self.__pizzaBuilder.buildTopping()

# 주어진 타입의 피자를 생성
if __name__ == "__main__":
    cook = Cook()
    hawaiianPizzaBuilder = HawaiianPizzaBuilder()
    spicyPizzaBuilder = SpicyPizzaBuilder()

    cook.setPizzaBuilder(hawaiianPizzaBuilder)
    cook.constructPizza()

    pizza = cook.getPizza()

    print(pizza)

출력결과

$ python builder.py 
cross
mild
ham + pineapple

댓글남기기