비슷한 기능을 하지만 종류가 다른 클래스들을 생성하는 인터페이스 제공
▷ 첫 번째, 추상 제품 인터페이스(추상클래스도 가능) : 제품에 대한 추상적 인터페이스 제공
▷ 두 번째, 구현 제품 클래스 : 팩토리가 생성할 구체적인 제품
▷ 세 번째, 추상 팩토리 인터페이스(추상클래스도 가능) : 추상 제품을 생산하는 인터페이스 제공
▷ 네 번째, 구현 팩토리 클래스 : 구현된 제품을 생산하는 방법 구현
기타 공장에서 통기타, 일렉기타 등 여러 종류의 기타를 만든다고 했을 때
[추상 제품 인터페이스]
// 기타의 몸통을 뜻하는 추상 제품 인터페이스
public interface IBody
{
...
}
// 기타의 현을 뜻하는 추상 제품 인터페이스
public interface IString
{
...
}
기타의 몸통 (Body), 현(String)을 뜻하는 기타를 만들기 위해 필요한 부품을 인터페이스로 표현
[구현 제품 클래스]
팩토리에서 생산할 제품을 정의했다
public class AcousticBody : IBody
{
...
}
public class ElectricBody : IBody
{
...
}
public class AcousticString : IString
{
...
}
public class ElectricString : IString
{
...
}
[팩토리 인터페이스]
제품을 생산할 팩토리 (공장)정의
여러 구현 팩토리 클래스에서 필수 공통적으로 재정의할 함수 선언
이렇게 되면, 구체적으로 어떤 제품을 생산할 지는 알 수 없지만, 어떤 속성의 제품을 생산할 지는 대략적으로 유추할 수 있다. (CreateBody를 통해 몸통을 생산하면 AcousticBody인지 ElectricBody인지는 알 수 없어도 IBody 타입이라는 것은 알 수 있다는 뜻)
public interface IGuitarFactory
{
IBody CreateBody();
IString CreateString();
}
//통기타를 만드는 공장인지 ? 일렉기타를 만드는 공장인지 ?
//어떤 종류의 기타던 몸통과 현이 필요하기 때문에 CreateBody와 CreateString함수를 정의해줌
[구현 팩토리 클래스]
각각 통기타와 일렉기타를 생산하는 것으로 공통 인터페이스를 상속 받지만 구체적인 내용은 커스텀이 가능하다
// 통기타를 생산하는 내용을 정의한 구현 팩토리 클래스
public class AcousticGuitarFactory : IGuitarFactory
{
public IBody CreateBody()
{
return new AcousticBody();
}
public IString CreateString()
{
return new AcousticString();
}
}
// 일렉기타를 생산하는 내용을 정의한 구현 팩토리 클래스
public class ElectricGuitarFactory : IGuitarFactory
{
public IBody CreateBody()
{
return new ElectricBody();
}
public IString CreateString()
{
return new ElectricString();
}
}
결론 : 어떤 팩토리를 통해 기타를 생산하던지, 공통 타입인 IBody 나 IString이 만들어진다
장점
1. 구체적인 클래스를 사용자로부터 분리 : 사용자는 생산되는 인터페이스만 알고있어도됨
2. 비슷한 속성의 객체 (같은 추상 제품을 상속받은 객체)들을 쉽게 대체하거나 교체할 수 있음.
3. 객체 과정에서의 일관성이 높아짐
단점
1. 수정이 불편하다
: 새로운 제품클래스를 추가하게 된다면 기존의 추상 팩토리를 확장하기가 쉽지 않다. 추상 팩토리를 상속하고있는 모든 팩토리에도 새로운 제품에 대한 구현방법이 수정되어야하기 때문이다.
'Design Pattern' 카테고리의 다른 글
[Design Pattern] 데코레이터 패턴 (0) | 2022.06.22 |
---|---|
Adapter Pattern (0) | 2022.06.09 |