티스토리 뷰

728x90

팩토리 메소드 패턴을 Python으로 구현해보았습니다.


구현 내용

 커피 가맹점에서 판매하는 커피의 종류가 다양하고, 가격도 모드 다릅니다. 커피의 이름과 가격은 가맹점의 위치에 따라서 변경이 가능합니다. aCafe의 위치는 사람이 적고, 학생들이 많이 모여있는 곳입니다. bCafe는 번화가에 차려진 카페입니다. 그에 따라 가격 조정이 필요한 가맹점입니다.


팩토리 메소드 패턴 다이어그램

 CafeStore와 Coffee가 있습니다.

 CafeStore에서는 주문 들어온 커피의 종류를 구분하는 팩토리메소드 aCafe와 bCafe가 있습니다.

 커피는 가격과 이름정보를 가지며, 커피의 종류는 5개로 구분하였습니다. 아이스커피, 아이스커피 화이트 밀크, 핫초코, 커피, 에스프레소 입니다. 이 이름들은 클래스의 이름이지 실제 이름은 가맹점마다 다르게 동작합니다.

구현

cafeStore.py - cafeStore에서 커피의 종류를 생성할 수 있습니다. order에 따라서 커피의 종류를 불러오게 됩니다.

from coffee import *

class CafeStore:
	COFFEE = 0
	ICEDCOFFEE = 1
	ICEDCOFFEEWITHMILK = 2
	HOTCHOCOLATE = 3
	ESPRESSO = 4
	
	def __init__(self, order):
		order.getCoffee()

#aCafe Factory
class aCafe:
	def orderCoffee(self, order):
		if order == CafeStore.COFFEE:
			return aCafeCoffee()
		elif order == CafeStore.ICEDCOFFEE:
			return aCafeIcedCoffee()
		elif order == CafeStore.ICEDCOFFEEWITHMILK:
			return aCafeIcedCoffeeWithMilk()
		elif order == CafeStore.HOTCHOCOLATE:
			return aCafeHotChocolate()
		elif order == CafeStore.ESPRESSO:
			return aCafeEspresso()

#bCafe Factory 는 aCafe Factory 동일하여 제외하였습니다.

coffee.py - 커피의 종류에 따른 가격, 이름을 정하는 클래스입니다. Coffee가 추상메소드의 역할을 수행하게 됩니다.

class Coffee:
	def __init__(self):
		self.price = 0
		self.name = None

	def getCoffee(self):
		print "Coffee Name : ", self.name, ", Price : ", self.price

#aCafe Coffee
class aCafeIcedCoffee(Coffee):
	def __init__(self):
		self.price = 4000
		self.name = "aCafe Iced Coffee"

#coffee 종류에 따른 가격과 이름을 정하는 클래스
class aCafeIcedCoffeeWithMilk(Coffee):
	def __init__(self):
		self.price = 5000
		self.name = "aCafe Iced Coffee With Milk"

#나머지 9개의 패턴에대해서는 제외합니다. 위의 내용과 동일하며 가격과 이름만 다르게 됩니다.

main 입니다. main에서 CafeStore에 따라서 aCafe, bCafe의 커피를 서로 다르게 호출 합니다.

if __main__ == '__main__':
	CafeStore(aCafe().orderCoffee(CafeStore.COFFEE))
	CafeStore(bCafe().orderCoffee(CafeStore.ESPRESSO))
	CafeStore(bCafe().orderCoffee(CafeStore.ICEDCOFFEE))


구현 완료


마무리

 팩토리 메소드를 Python으로 구현해보았습니다. 예제코드 자체는 제가 만들었지만 기본적인 내용은 wiki백과를 참고하였습니다.

 전체코드는 아래 더보기를 눌러서 다운 받으시면 됩니다.





댓글