배고픈 개발자 이야기

3.팩토리 메서드 (Factory method) 패턴 본문

전산학/디자인패턴

3.팩토리 메서드 (Factory method) 패턴

이융희 2019. 9. 14. 14:22
728x90

팩토리 메서드 패턴객체지향 디자인 패턴이다. Factory method는 부모(상위)클래스에 알려지지 않은 구체 클래스를 생성하는 패턴이며, 자식(하위) 클래스가 어떤 객체를 생성할지를 결정하도록 하는 패턴이기도 하다. 부모(상위) 클래스 코드에 구체 클래스 이름을 감추기 위한 방법으로도 사용한다.

 

 

Factory Method라는 패턴 이름이 적절하지 못한데, 이름으로 인해 객체를 생성하는 메소드를 Factory method라 오해하는 개발자가 많이 있다. 이런 생성 메소드가 모두 Factory method 패턴을 사용하는 것은 아니다. Template Method의 생성 패턴 버전으로 볼 수 있는데 Template method를 알지 못한다면 그 패턴을 먼저 이해하는 것이 Factory Method를 이해하기 수월할 것이다.

 

 

Factory Method가 중첩되기 시작하면 굉장히 복잡해 질 수 있다. 또한 상속을 사용하지만 부모(상위) 클래스를 전혀 확장하지 않는다. 따라서 이 패턴은 extends 관계를 잘못 이용한 것으로 볼 수 있다. extends관계를 남발하게 되면 프로그램의 엔트로피가 높아질 수 있으므로 Factory Method 패턴의 사용을 주의해야 한다.

 

-테스트 코드

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

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


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


class aCafeHotChocolate(Coffee):
	def __init__(self):
		self.price = 4500
		self.name = "aCafe Hot Chocolate"


class aCafeEspresso(Coffee):
	def __init__(self):
		self.price = 3500
		self.name = "aCafe Espresso"


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


class aCafeIcedCoffeeWithMilk(Coffee):
	def __init__(self):
		self.price = 5000
		self.name = "aCafe Iced Coffee With Milk"

#bCafe Coffee
class bCafeCoffee(Coffee):
	def __init__(self):
		self.price = 4000
		self.name = "bCafe Coffee"


class bCafeHotChocolate(Coffee):
	def __init__(self):
		self.price = 4500
		self.name = "bCafe Hot Chocolate"


class bCafeEspresso(Coffee):
	def __init__(self):
		self.price = 3500
		self.name = "bCafe Espresso"


class bCafeIcedCoffee(Coffee):
	def __init__(self):
		self.price = 4000
		self.name = "bCafe Iced Coffee"


class bCafeIcedCoffeeWithMilk(Coffee):
	def __init__(self):
		self.price = 5000
		self.name = "bCafe Iced Coffee With Milk"
########## 커피의 종류에 따른 가격, 이름을 정하는 클래스입니다. Coffee가 추상메소드의 역할을 수행


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()


class bCafe:
	def orderCoffee(self, order):
		if order == CafeStore.COFFEE:
			return bCafeCoffee()
		elif order == CafeStore.ICEDCOFFEE:
			return bCafeIcedCoffee()
		elif order == CafeStore.ICEDCOFFEEWITHMILK:
			return bCafeIcedCoffeeWithMilk()
		elif order == CafeStore.HOTCHOCOLATE:
			return bCafeHotChocolate()
		elif order == CafeStore.ESPRESSO:
			return bCafeEspresso()
##### cafeStore에서 커피의 종류를 생성할 수 있습니다. order에 따라서 커피의 종류를 불러오게 됩니다.


if __name__ == "__main__":
    CafeStore(aCafe().orderCoffee(CafeStore.HOTCHOCOLATE))
    CafeStore(aCafe().orderCoffee(CafeStore.ICEDCOFFEEWITHMILK))
    CafeStore(aCafe().orderCoffee(CafeStore.COFFEE))
    CafeStore(bCafe().orderCoffee(CafeStore.ESPRESSO))
    CafeStore(bCafe().orderCoffee(CafeStore.ICEDCOFFEE))

'전산학 > 디자인패턴' 카테고리의 다른 글

4.싱글톤 (Singleton) 패턴  (0) 2019.09.14
2.커맨드 (Command) 패턴  (0) 2019.09.14
1.옵저버(Observer) 패턴  (0) 2019.09.08
0.스트래티지 (strategy pattern) 패턴  (0) 2019.09.08
Comments