Factory Method Pattern

개념
- 인스턴스를 생성하는 공장을 Template Method패턴으로 구성한 것이 Factory Method 패턴이다.

I. 의도

     객체를 생성하기 위해 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브클래스에서 이루어지도록 한다. 설계를 재정의 가능한 것으로 하면서도 복잡해지지 않게 한다

정의 : 인스턴스를 생성하는 공장을 Template Method패턴으로 구성한 것이 Factory Method 패턴이다.
       : 생성할 구상 클래스를 서브 클래스에서 결정

II. 활용

  • 생성할 객체 타입을 예측할 수 없을 때
  • 생성할 객체를 기술하는 책임을 서브클래스에게 정의하고자 할 때
  • 객체 생성의 책임을 서브클래스에 위임시키고 서브클래스에 대한 정보를 은닉하고자 할 때

III. 결과

  • 애플리케이션에 국한된 클래스가 코드에 종속될 필요를 없애준다. Product 클래스에 정의된 인터페이스와만 동작하도록 코드를 작성하고, 이후 사용자가 정의한 concreteProduct 클래스와 동작할 수 있게 한다
  • 서브클래스에 대한 hook 메소드 제공- 객체별로 서로 다른 버전을 제공하는 후크 기능을 서브클래스에 정의
  • 병렬적 클래스 계층도를 연결하는 역할을 담당한다

IV. 단점

  • 클라이언트가 creator 클래스를 반드시 상속해 구체적 제품을 생성해야 한다는 것
  • 제품 클래스가 바뀔 때마다 새로운 서브클래스를 생성해야 한다
  • 클래스 계층이 커질 수 있다

 

관련 패턴: Abstract Factory 패턴은 Fatory Method를 이용해 구현하는 경우가 많다. Factory Method 패턴은 Template Method 패턴에서도 사용되는 경우가 많다

Product

팩토리 메소드가 생성하는 객체의 인터페이스를 정의

ConcreteProduct

Product 클래스에 정의된 인터페이스를 실제로 구현

Creator

Product 타입의 객체를 반환하는 팩토리 메소드를 선언

ConcreteCreator

ConcreteProduct의 인스턴스를 반환

하기 위해 팩토리 메소드를 재정의

 

예제코드

public class FactoryMethodTest {

    public static void main(String[] args) {

        Creator seoul = new ConcreteSeoulCreator();

        seoul.anOperation("한국타이어");

        Creator busan = new ConcreteBusanCreator();

        busan.anOperation("금호타이어");

    }

}

abstract class Creator {

    public void anOperation(String type) {

        //타이어조립 공정

        Product product = factoryMethod(type);

        product.make();

    }

    public abstract Product factoryMethod(String type);

}

class ConcreteSeoulCreator extends Creator {

    @Override

    public Product factoryMethod(String type) {

        if(type.equals("한국타이어")) {

                     return new 한국타이어();

        }

        return null;

    }

}

class ConcreteBusanCreator extends Creator {

    @Override

    public Product factoryMethod(String type) {

        if(type.equals("금호타이어")) {

            return new 금호타이어();

        }

        return null;

    }

}

abstract class Product {

    public abstract void make();

}

class 한국타이어 extends Product {

    @Override

    public void make() {

           System.out.println("make 한국타이어");

    }

}

class 금호타이어 extends Product {

    @Override

    public void make() {

           System.out.println("make 금호타이어");

    }

}

댓글