클라이언트가 전달한 인자에 따라 클라이언트가 직접 클래스를 호출하지 않고 객체를 생성
from abc import ABCMeta, abstactmethod
class Animal(metaclass = ABCMeta):
@abstactmethod
def say_something(self):
pass
class Cat(Animal):
def say_something(self):
print("Meow")
class Dog(Animal):
def say_something(self):
print("Bark")
class Factory(object):
def say(self, object_type):
return(eval(object_type.capitalize())().say_something())
animals = ["cat", "dog"]
factory = Factory()
for animal in animals:
factory.say(animal)
장점:
클라이언트가 수정할 필요 없이 호출만 하면됨
확장에 편함
생성 해야할 객체가 추가 되어도 객체를 생성하는 부분만 건드리면 됨
단점:
공장에서 무슨 데이터가 들어왔는지 확인해야해서 조건문이 길어질 수가 있다.
→ Animal, Factory를 추상화 해서 공장에 인터페이스를 만들고 오버라이딩을 하면 공장에 조건문을 계속 수정하지 않고 공장을 만들수 있다 (팩토리 메서드 패턴)
→ …(추상 팩토리 패턴)