승상의 코딩 블로그

디자인 패턴 - 빌더 패턴(Builder Pattern) with 파이썬(python) 본문

Python (파이썬)

디자인 패턴 - 빌더 패턴(Builder Pattern) with 파이썬(python)

양승상 2023. 7. 9. 12:19

 

2023.05.29 - [Python (파이썬)] - 디자인 패턴 - 팩토리 패턴(Factory Pattern) with 파이썬(python)

 

디자인 패턴 - 팩토리 패턴(Factory Pattern) with 파이썬(python)

디자인 패턴은 반복적이고 보편적으로 일어나는 문제에 대한 해결방안을 제시해줍니다. 그 중 가장 인기있는 패턴인, 팩토리 패턴(Factory Pattern)에 대해서 알아보려고 합니다. 팩토리 패턴은 객

seungsang.tistory.com

이 팩토리 패턴의 예시를 다르게 생각해봅시다.

 

커피를 생성하는 팩토리 패턴을 간단히 만들어 보겠습니다.

class Coffee:
    def __init__(self, additive):
    	self.additive = additive

class CoffeeFactory:
    def createLatte(self):
    	additive = ['steamed milk', 'milk form']
        return Coffee(additive)
   
    def createVanillaLatte(self):
    	additive = ['steamed milk', 'vanilla syrup']
        return Coffe(additive)
        
coffeeFactory = CoffeeFactory()
coffeeFactory.createLatte()
coffeeFactory.createVanillaLatte()

우리가 원하는 제품이 있다면, 원하는 제품을 생성하는 함수(ex. Latte, VanillaLatte)를 CoffeFactory 에서 호출하면 됩니다.

 

Factory 에서 만드는 제품이 간단한 제품이 아닐뿐 아니라, 그 제품의 양이 많아질 수록 문제가 생깁니다. 

왜냐하면, 생성하는 제품에 대한 제어가 어렵기 때문입니다.

 

이 코드를 빌더 패턴을 활용해서 수정해보도록 하겠습니다.

class Coffee:
    def __init__(self, additive):
        self.steamedMilk = None
        self.milkForm = None
        self.vanillaSyrup = None
        self.espresso = None

    def setSteamedMilk(self, steamedMilkType):
        self.steamedMilk = steamedMilkType
       
    def setMilkForm(self, milkFormType):
    	self.milkForm = milkFormType
        
    def setVanillaSyrup(self, vanillaSyrupType):
    	self.vanillaSyrup = vanillaSyrupType

class CoffeeBuilder:
    def __init__(self):
    	self.coffee = Coffee()

    def addSteamedMilk(self, steamedMilkType):
    	self.coffee.setSteamedMilk(steamedMilkType)
        return self
   
    def addMilkFormType(self, milkFormType):
    	self.coffee.setMilkFormType(milkFormType)
        return self

    def addVanillaSyrup(self, vanillaSyrupType):
    	self.coffee.setVanillaSyrup(vanillaSyrupType)
        return self
    
    def build(self):
    	# 최종 반환
    	return self.coffee
        
        
# coffeeFactory.createLatte() 이전 Factory 패턴으로 만든 라떼가 아래로 바뀜
coffeeBuilder = CoffeeBuilder()\
                    .addSteamedMilk('Seoul Milk')\
                    .addVanillaSyrup('Sugar Free')\
                    .build()
  1. Coffee 클래스에 내부의 파라미터(재료)를 설정하는 함수를 정의해 줍니다.
    Coffee 클래스는 직접적으로 생성되지 않고, CoffeeBuilder 클래스에 의해 생성됩니다.
  2. CoffeeBuiler 에는 Coffee 클래스의  내부 파라미터를 설정하는 함수를 추가해주고, self(CoffeeBuiler) 를 반환해줍니다.
  3. 최종적으로 원하는 것은 Coffee 클래스이므로 build 함수를 통해 Coffee 를 반환할 수 있게 합니다.

이제, 새로운 재료가 추가되면, 새로운 재료를 추가만 해주면 됩니다!

 

 

조금 더 와 닿게 하기 위해, 스타벅스 어플을 예시로 소개해드립니다. 

아이스 자몽 허니 블랙티를 주문할 때, 퍼스널 옵션을 통해 재료 하나하나를 커스터마이징할 수 있습니다. (빌더 패턴)

만약 완성된 제품만을 바로 주문하게 한다면, 좌측 이미지의 메뉴 창의 메뉴가 엄청나게 많아질 것입니다. 

ex. 얼음 적은 아이스 자몽 허니 블랙 티, 시럽 한번 추가한 아이스 자몽 허니 블랙 티

 

사용자가 제어하는 부분이 많아질수록 사용자는 많이 불편하게 느낄 수 있지만, 그에 따라 인터페이스가 간단해질 수도 있는 경우에 대해서 살펴봤습니다.

상황에 따라 같은 말이라도 의미나 영향이 달라질 수 있다는 것을 잊지 마세요!

반응형
Comments