[디자인 패턴] 팩토리 패턴
Simple factory
단순히 객체를 생성하는 부분을 캡슐화해서 객체를 생성할때 사용한다.
위와 같은 방식으로 캡슐화 해놓으면 여러 클래스에서 팩토리를 사용하게 되는 상황에서 구현을 변경할때
여기저기 변경할 필요가 없다.
Simple factory 구현 방법
1.클라이언트는 ProduceFactory를 가진다.
2.ProduceFactory에서 조건에 맞는 Product를 생성해준다.
3.Product를 상위 형식으로 구현하고 서브 클래스로 구체화된 클래스들을 둔다.
-> 다형성을 이용해서 항상 factory를 호출하게되면 Product형식을 받을수있게 할수있다.
Factory method pattern
사용하는 서브 클래스에 따라 생산되는 객체가 결정되는 디자인 패턴
1. Product와 Factory(Creator)를 abstract class로 생성한다.
2. Factory(Creator)는 Product 형식을 리턴해주는 메소드를 생성한다.
3. ConcreteFactory(ConcreteCreator)에서 ConcreteProduct를 리턴해주는 메소드로 오버라이드 한다.
Product를 생성하는 부분과 사용하는 부분이 느슨하게 결합되어있어 제품 변경에 유연하다.( Creator 인터페이스와 ConcreteProduct )
그렇기 때문에 ConcreteCreator 가 하나밖에 없더라도 사용할 수 있다.
Simple factory와 Factory method pattern의 차이점
“팩토리 메소드 패턴이 간단한 팩토리와 상당히 비슷합니다. 하지만 간단한 팩토리는 일회용 처방에 불과한 반면, 팩토리 메소드 패턴을 이용하면 어떤 구현을 사용할지를 서브클래스에서 결정하는 프레임워크를 만들 수 있다는 결정적인 차이점입니다. 간단한 팩토리에서는 객체 생성을 캡슐화하는 방법을 사용하긴 하지만 팩토리 메소드 패턴처럼 강력한 유연성을 제공하진 못합니다. 생성하는 제품을 마음대로 변경할 수 없기 때문입니다.”
의존성 역전 원칙
추상화된것에 의존하게 만들고 구상 클래스에 의존하지 않게 만든다.
만약 Factory에서 각각 모든 구상 클래스들을 생성하면 Factory는 모든 구상 클래스에 의존성을 갖게된다.
하지만 구상 클래스들을 Product라는 추상 클래스로 선언하고 이를 의존하면 서로간에 의존성은 낮아진다.
Abstract factory pattern
구상 클래스에 의존하지 않고 서로 연관되거나 의존적인 객체로 이루어진 제품군을 생산하는 인터페이스를 제공한다.
구상 클래스는 서브 클래스에서 만든다.
위와 같이 클라이언트에서 추상 인터 페이스를 통해 특정 제품들을 받을 수 있다.
1.AbstactFactory는 제품을 생산할때 일련의 공통적인 메소드가 정의되어있다.
2.ConcreteFactory1, 2는 서로 자신에게 맞는 Product를 생산한다.
3.Client는 AbstactFactory를 기반으로 객체를 만든다.
Factory method pattern 과 Abstract factory pattern 의 차이점
Factory method pattern 은 Client와 ConcreteProduct를 분리 시켜야할때 사용
- 메서드(Factory Method) 레벨에서 포커스를 맞춤
- ConcreteProduct와 Client 간의 결합도를 낮춤
Abstract factory pattern 은 일련의 제품군을 만들어야할때 사용
- 클래스(Abstract Factory) 레벨에서 포커스를 맞춤
- ConcreteFactory와 Client간의 결합도를 낮춤
- 제품이 추가되면 인터페이스를 변경하고 모든 서브 클래스들을 변경해야하는 단점이 있다.
Reference.
헤드 퍼스트 디자인 패턴
* 디자인 패턴 구현 깃허브