참고
Factory Method는 같은 기능을 하는 클래스가 인스턴스화 될때
계속 해서 코드를 반복해서 고치는 일 없이 코드가 작동해야해서 만들어진 패턴이다. 예를들어
여기서 이야기하는 화물운반일을 하는 트럭과 배가 있다고 치자 여기서 비행기 라는 새로운 클래스가 필요하다면
class Truck:
def deliver(self):
return "트럭을타고운반한다"
class Ship:
def deliver(self):
return "배를타고운반한다"
def get_transport(transport):
if transport == "truck":
return Truck()
elif transport == "ship":
return Ship()
transport1 = get_transport("truck")
print(transport1.deliver()) # output : "트럭을타고 운반한다"
transport2 = get_transport("ship")
print(transport2.deliver()) # output : "배를타고운반한다"
class Airplane:
def deliver(self):
return "비행기를타고운반한다"
# get_transport를 재정의한다.
def get_transport(transport):
if transport == "truck":
return Truck()
elif transport == "ship":
return Ship()
elif transport == "airplane":
return Airplane()
transport3 = get_transport("airplane")
print(transport3.deliver()) # output : "비행기를타고운반한다"
이렇게 비행기를 추가하면 되는데
매번 이렇게 사용할 수 있다.
**transport3 = get_transport("airplane")
print(transport3.deliver()) # output :** "비행기를타고운반한다"
이코드는 매번 이런식으로 사용할 수는 없다.
왜냐하면 코드를 선언하는 입장에서
**transport3 = get_transport("airplane")
print(transport3.deliver()) # output :** "비행기를타고운반한다" 이코드가 반드시 동작된다고 장담할 수 없다.
이코드가 반드시 아래 메소드를 실행시킨다고 장담할 수 없기 때문이다. 그리고 실제로 사용은 더 복잡하다
class Transport:
def __init__(self):
self.lst_load_item = []
def loading(self):
db = conn_db()
qs = db.getquery("select 실어야할짐 from 짐뭉치")
for item in qs:
self.lst_load_item.append(item)
def move_item(self):
#짐을 옮겨 놓는코드 작성
pass
def check_access_point(self):
#짐이 운반되는 포인트 확인
pass
def deliver(self):
self.loading()
self.move_item()
self.check_access_point()
pass
class Airplane(Transport):
def deliver(self):
return "비행기를타고운반한다"
# get_transport를 재정의한다.
def get_transport(nm_transport):
if transport == "truck":
return Truck()
elif transport == "ship":
return Ship()
elif transport == "airplane":
return Airplane()
이렇게 기본으로 사용하게될 클래스가 복잡해지면 복잡해질수록 새로 붙여지는 코드도 복잡해지고 혼잡해진다.
만약 같은 기능을 하는 것들을 Factory Method 패턴으로 묶어두면 기능을 강제하기도 쉽고 유지보수도 용이해질 것이다.
실제로 사용되는 코드는 훨씬 복잡할 것이다.
주니어 개발자가 회사내에 있다면 회사내에 모든 코드의 작동방법들을 상세하게 하나하나 알려주고 감시할 수 있는 것이 아니라면 팩토리 메소드를 구성한다면 훨씬 쉽게 확장 / 사용 가능한 코드를 만들 수 있을 것