-
Notifications
You must be signed in to change notification settings - Fork 5
3주차 스터디 김성연 팩토리 패턴
-
객체를 생성하기 위해 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브 클래스가 결정
-
다시 말해 생성자는 어떤 모양으로 어떤 내용을 가지고 인스턴스가 만들어지는지 알지 못하고 생산만 함
-
어떤 클래스가 자신이 생성해야 하는 객체의 클래스를 미리 예측할 수 없을 때
-
생성할 객체를 기술하는 책임을 자신의 서브 클래스가 지정했으면 할 때
-
객체 생성의 책임을 몇개의 보조 서브클래스 가운데 하나에게 위임하고, 어떤 서브 클래스가 위임자인지에 대한 정보를 국소화시키고 싶을 때
-
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)을 통해 객체를 만들고 팩토리 메소드는 상속을 통해 만든다
- 다시 말해 추상 팩토리를 이용할 때는 일단 팩토리에 해당하는 인스턴스를 만들고 추상 형식의 함수를 써서 제품 하나 객체를 만든다.
- 추상 팩토리는 일련의 제품군에 새로운 제품이 추가 될 때 인터페이스(추상 클래스) 자체를 바꿔야 한다.
- 추상 팩토리는 일련의 제품군을 생성하기 때문에 인터페이스가 아주 큰 편이다. 반면 팩토리 메서드는 한가지만 생산하기 때문에
인터페이스가 작은 편