지식/디자인패턴
Head First Design Patterns : Factory Pattern
by CodeRain
2023. 12. 31.
Factory Method Pattern
팩토리 메서드 패턴
- 객체를 생성할 때 필요한 인터페이스를 정의하고, 어떤 클래스 인스턴스를 만들지 서브클래스에서 결정.
- new 연산자를 사용한 객체 생성 직접 호출들을 특별한 팩토리 메서드에 의한 호출로 대체. 서브클래스에서 이 메서드를 오버라이드 하여 생성될 객체들을 결정.
구조
Factory Method Pattern 구조
- product
- concreteProduct
- creator
- product 객체들을 반환하는 factory method 존재.
- 반환은 creator가 하지만 생성의 주체가 아님.
- 일반적으로 핵심 비즈니스 로직이 있고 factory method는 이 로직을 product로 부터 분리
- concreteCreator
- factory Method를 오버라이딩 하여 각각 다른 유형의 제품 반환.
factory Method들은 항상 새로운 인스턴스를 생성해야 할 필요가 없음.
캐시, 객체 풀 또는 다른 소스에서 기존 개체 반환 가능.
장점
단점
- 구현해야 하는 객체가 늘어 날 수록 클래스도 추가해 줘야 하기 때문에 코드 복잡성 증가
예
- java.util.Calendar#getInstance()
- java.util.ResourceBundle#getBundle()
- java.text.NumberFormat#getInstance()
- java.nio.charset.Charset#forName()
- java.net.URLStreamHandlerFactory#createURLStreamHandler(String) (프로토콜에 따라 다른 싱글턴 객체를 반환합니다.)
- java.util.EnumSet#of()
- javax.xml.bind.JAXBContext#createMarshaller() 와 다른 유사한 메서드들.
Abstract Factory Pattern
추상 팩토리 패턴
- 구상 클래스에 의존하지 않고도 서로 연관되거나 의존적인 객체로 이루어진 제품군을 생산하는 인터페이스 제공.
- 다양한 구성 요소별로 '객체의 집합'을 생성해야 할 때 유용
구조
추상 팩토리 메서드 구조
- AbstractProduct
- 제품군을 구성하는 고유하지만 관련된 제품 집합에 대한 인터페이스
- Product
- 각 제품의 구현체들. 팩토리 객체로부터 생성.
- AbstractFactory
- 모든 구상 팩토리에서 구현해야 하는 인터페이스
- ConcreteFactory
장점
- 생성되는 제품들의 상호 호환을 보장
- 단단한 결합 피할 수 있음
- SRP
- OCP
단점
- 클래스 들이 많아지기 때문에 코드 복잡성 증가.
예
- javax.xml.parsers.DocumentBuilderFactory#newInstance()
- javax.xml.transform.TransformerFactory#newInstance()
- javax.xml.xpath.XPathFactory#newInstance()
참조