Skip to content

3주차 스터디 김성연 팩토리 패턴

abiles edited this page Nov 4, 2014 · 6 revisions

팩토리 : 생성 부분을 분리 하자

팩토리 메서드 패턴

의도

  • 객체를 생성하기 위해 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브 클래스가 결정

  • 다시 말해 생성자는 어떤 모양으로 어떤 내용을 가지고 인스턴스가 만들어지는지 알지 못하고 생산만 함

활용성

  • 어떤 클래스가 자신이 생성해야 하는 객체의 클래스를 미리 예측할 수 없을 때

  • 생성할 객체를 기술하는 책임을 자신의 서브 클래스가 지정했으면 할 때

  • 객체 생성의 책임을 몇개의 보조 서브클래스 가운데 하나에게 위임하고, 어떤 서브 클래스가 위임자인지에 대한 정보를 국소화시키고 싶을 때

협력 방식

  • Creator는 자신의 서브 클래스를 통해 실제 필요한 팩토리 메서드를 정의하여 적절한 ConcreteProduct의 인스턴스를

    반환할 수 있게 함

결과

  • 팩토리 메서드 패턴은 응용프로그램에 국한된 클래스가 코드에 종속되지 않도록 한다.

  • 서브클래스에 대한 훅(hook) 매서드를 제공 : 팩토리 메서드로 클래스 내부에서 객체를 생성하는 것이 객체를 직접 생성하는 것 보다 훨씬 응용성이 높아짐

  • 병렬적인 클래스 계통을 연결하는 역할을 담당

  • 객체 생성 코드를 한 객체 혹은 메소드에 집어넣어 코드 중복을 제거

  • 관리시 생성 코드 하나만 관리

구현

  • Creator를 추상 클래스로 정의 하고, 정의한 팩토리 메서드에 대한 구현은 제공하지 않는 경우

  • Creator 클래스에서는 서브 클래스에서 재정의될 메서드들을 지정한다.(생산과 관련된 것들)

  • 이를 토대로 서브 클래스들이 각자 자신에 맞게 메서드를 재정의 한다.

  • 사용자는 똑같은 메서드를 사용해서 서로 다른 인스턴스를 얻을 수 있게 된다.

Class MissileFactory
{
public:
  virtual Missile* CreateMissile();

...
}

Class MeleeMissileFactory : public MissileFactory
{
public:
  virtual Missile* CreateMissile()
  //구현부를 바로 보면
  { 
     return new MeleeMissile();
  }
  ...
}

Class MeleeMissileFactory : public MissileFactory
{
public:
  virtual Missile* CreateMissile()
  //구현부를 바로 보면
  { 
     return new MeleeMissile();
  }
  ...
}


Class AimingMissileFactory : public MissileFactory
{
public:
  virtual Missile* CreateMissile()
  {
      return new AimingMissile();  
  }
}

//실제 사용시, 누군가 amingmissile을 만들고 싶다면
MissileFactory aimingFactory = new AimingMissileFactory();
Missile aiming = aimingFactory.CreateMissile();

추상 팩토리 패턴

정의

  • 구상클래스를 지정하지 않고 인터페이스를 이용하여 서로 연관된, 혹은 의존하는 객체를 생성할 수 있다.

  • 클라이언트가 실제 어떤 제품이 만들어 지는지 알 필요가 없다.

  • 일련의 연관된 제품등를 한번에 묶을 수 있다.

구현

//추상 클래스
Class MissileIngredientFactory
{
  virtual Engine createEngine();
  virtual Wing createWing();
  virtual Seat createSeat();
 ...
}

Class MeleeMissileIngredientFactory : public MissileIngredientFactory
{
  virtual createEngine()
  { 
    return new Engine();
  }
 ...
}

//사용부

MissileIngredienFactory mIf = new MeleeMissileIngredientFactory();
Engine engine = mIf.createEngine();

추상 팩토리와 팩토리 메소드 패턴의 공통점, 차이점

공통점

  • 애플리케이션을 특정 구현으로부터 분리시키는 것이 목적

차이점

  • 추상 팩토리는 일련의 제품군을 한꺼번에 조정하는데 유용하고 팩토리 메소드는 단일 제품을 만드는데 유용하다
  • 추상팩토리는 팩토리 메소드를 이용해 구성될 수 있다.
  • 추상 팩토리는 객체 구성(Composition)을 통해 객체를 만들고 팩토리 메소드는 상속을 통해 만든다
  • 다시 말해 추상 팩토리를 이용할 때는 일단 팩토리에 해당하는 인스턴스를 만들고 추상 형식의 함수를 써서 제품 하나 객체를 만든다.
  • 추상 팩토리는 일련의 제품군에 새로운 제품이 추가 될 때 인터페이스(추상 클래스) 자체를 바꿔야 한다.
  • 추상 팩토리는 일련의 제품군을 생성하기 때문에 인터페이스가 아주 큰 편이다. 반면 팩토리 메서드는 한가지만 생산하기 때문에
    인터페이스가 작은 편
Clone this wiki locally