====== the Definition of Factory Method Pattern ====== 팩토리 메소드 패턴의 정의는 다음과 같습니다. 팩토리 메소드 패턴 - 팩토리 메소드 패턴에서는 객체를 생성하기 위한 인터페이스를 정의하는데, 어떤 클래스의 인스턴스를 만들지는 서브 클래스에서 결정하게 만듭니다. 팩토리 메소드 패턴을 이용하면 클래스의 인스턴스를 만드는 일을 서브클래스에게 맡기는 것이죠. 다른 모든 팩토리를 쓸 때와 마찬가지로 팩토리 메소드 패턴을 사용하여 구상 형식의 인스턴스를 만드는 작업을 캡슐화 할 수 있습니다.\\ 밑에 있는 클래스 다이어 그램을 보면, Creator 추상 클래스에서 객체를 만들기 위한 메소드, 즉 팩토리 메소드를 위한 인터페이스를 제공한다는 것을 알 수 있습니다.\\ Creator 추상 클래스에 구현되어 있는 다른 메소드에서는 팩토리 메소드에 의해 생산된 제품을 가지고 필요한 작업을 처리합니다.\\ 하지만 실제 팩토리 메소드를 구현하고 제품(객체 인스턴스)를 만들어내는 일은 서브클래스에서만 할 수 있습니다. 위에 있는 정의에도 나와 있지만, 다른 개발자들이 "팩토리 메소드 패턴에서는 어떤 클래스의 인스턴스를 만들지를 서브 클래스에서 결정한다"라고 하는 얘기를 종종 듣게 될 것입니다.\\ 여기에서 "결정한다"라는 표현을 쓰는 이유는, 이 패턴을 사용할 때 서브클래스에서 실행중에 어떤 클래스의 인스턴스를 만들지를 결정하기 때문이 아니라, 생산자 클래스 자체가 실제 생산될 제품에 대한 사전지식이 전혀 없이 만들어지기 때문입니다.\\ 사실 더 정확하게 표현하자면, 사용하는 서브 클래스에 따라 생산되는 객체 인스턴스가 결정될 것입니다. {{:study:java:design_pattern:factory_method.jpg|Factory Method}} {{keywords>Factory Method Pattern Abstract Factory}} ===== An Example of Factory Method Pattern ===== 팩토리 메소드 패턴의 예로 피자의 주문을 처리하는 피자가게를 팩토리 메소드 패턴을 이용해 구현해 보고자 합니다.\\ 뉴욕풍 피자를 만드는 뉴욕피자가게와 시카고풍 피자를 만드는 시카고피자가게를 만들고자 합니다. \\ **%%PizzaStore%%**에서는 어떤 피자를 만들지는 모릅니다. 어떤 피자를 만들지는 순전히 뉴욕피자가게(**%%NYPizzaStore%%**)와 시카고피자가게(**%%ChicagoPizzaStore%%**)가 결정하게 됩니다. {{:study:java:design_pattern:pizzastore.jpg|Pizza Store}} ====== the Definition of Abstract Factory Pattern ====== 팩토리 메소드 패턴의 형제인 추상 팩토리 패턴을 소개합니다. 정의는 다음과 같습니다. 추상 팩토리 패턴 - 추상 팩토리 패턴에서는 인터페이스를 이용하여 서로 연관된, 또는 의존하는 객체를 구상 클래스를 지정하지 않고도 생성할 수 있습니다. 추상 팩토리 패턴을 사용하면, 클라이언트에서 추상 인터페이스를 통해서 일련의 제품들을 공급받을 수 있습니다.\\ 이때, 실제로 어떤 제품이 생산되는지는 전혀 알 필요도 없습니다. 따라서 클라이언트와 팩토리에서 생산되는 제품을 분리시킬 수 있습니다.\\ 클래스 다이어 그램을 살펴봅시다. {{:study:java:design_pattern:abstract_factory.jpg|Abstract Factory}} ===== An Example of Abstract Factory Pattern ===== 이제 마지막으로 추상 팩토리 패턴을 구현한 예를 살펴봅시다. \\ 위의 클래스 다이어 그램에서 %%Client%%에 해당되는 것이 **%%PizzaStore%%**의 예에서 나온 **%%NYPizzaStore%%**나 **%%ChicagoPizzaStore%%**에 해당됩니다. {{:study:java:design_pattern:pizzafactory.jpg|Pizza Factory}}