빌더 패턴
업데이트:
Builder Pattern
복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴. 복잡한 객체를 빌드하는 프로세스를 캡슐화 또는 숨기는 작업을 하고 해당 객체와 해당 구조의 표현을 분리한다.
이에 더해 생성자에 전달하는 인수에 의미를 부여할 수 있다.
생성자를 통해서 멤버를 생성하지 않고 내부 클래스(빌더)를 통해 생성한다.
![]()
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
댓글남기기