[Design Pattern]팩토리 패턴

디자인 패턴의 팩토리 패턴 정리

Factory Pattern

  • 배울 것
    • 느슨한 결합을 이용하는 객체지향 디자인
    • 객체의 인스턴스를 만드는 작업이 항상 공개되어 있어야 하는 것은 아니며, 모든 것을 공개했다가는 결합과 관련된 문제가 생길 수 있다
    • 팩토리 패턴을 이용해 불필요한 의존성을 없앨 수 있다.

구상 클래스를 바탕으로 코딩을 하면 나중에 코드를 수정해야 할 가능성이 높아지고, 유연성이 떨어지게 됨

  • 팩토리 메소드는 객체 생성을 처리하며, 팩토리 메소드를 이용하면 객체를 생성하는 작업을 서브클래스에 캡슐화시킬 수 있음.
    • 이렇게 하면 수퍼클래스에 있는 클라이언트 코드와 서브클래스에 있는 객체 생성 코드를 분리시킬 수 있음.

      abstract Product factoryMethod(String type)

    • abstract : 팩토리 메소드는 추상 메소드로 선언해 서브클래스에서 객채 생성을 책임지도록 함
    • Product : 팩토리 메소드에서는 특정 제품(객체)를 리턴하며, 그 객체는 보통 수퍼클래스에서 정의한 메소드 내에서 쓰이게 됨
    • factoryMethod : 팩토리 메소드는 클라이언트(수퍼클래스에 있는 orderPizza() 같은 코드)에서 실제로 생성되는 구상 객체가 무엇인지 알 수 없게 만드는 역할
    • String type : 팩토리 메소드를 만들 때 매개 변수를 써서 만들어낼 객체 종류를 선택할 수도 있음

factory

모든 팩토리 패턴에서는 객체 생성을 캡슐화
팩토리 메소드 패턴에서는 서브클래스에서 어떤 클래스를 만들지를 결정하게 함으로써 객체 생성을 캡슐화

Creator 클래스

  • PizzaStore
    • 추상 Creator 클래스.
    • 나중에 서브 클래스에서 제품(객체)을 생산하기 위해 구현할 팩토리 메소드(추상 메소드)를 정의
    • Creator 클래스에 추상 제품 클래스의 의존하는 코드가 들어있는 경우도 있음.
    • 제품 클래스의 객체는 이 클래스의 서브클래스에 의해 만들어짐. ~~> Creator 클래스 자체에서는 절대로 어떤 구상 제품 클래스가 만들어질지 미리 알 수 없음
  • NYPizzaStore, ChicagoPizzaStore
    • 구상 Creator.
    • 팩토리 메소드인 createPizza() 구현. 이 메소드에서 제품(피자 객체)을 생산
    • 각 분점마다 PizzaStore의 서브클래스가 따로 있기 때문에 createPizza() 메소드 구현을 통해 그 가게 고유의 피자를 마음대로 생성 가능

Product 클래스

  • Pizza : 팩토리에서는 제품을 생산.
  • MYStyleCheesePizza, … : 구상 클래스.

팩토리 메소드 패턴 정의

팩토리 메소드 패턴에서는 객체를 생성하기 위한 인터페이스를 정의하는데, 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정하게 만듭니다. 팩토리 메소드 패턴을 이용하면 클래스의 인스턴스를 만드는 일을 서브클래스에게 맡기는 것이죠.

  • 팩토리 메소드 패턴을 사용해 구상 형식의 인스턴스를 만드는 작업을 캡슐화할 수 있음.

용어

  • 팩토리 : 객체 생성을 처리하는 클래스