팩토리를 만드는 팩토리! 라고밖에는 이해가 안간다.....
언제 사용할까.
코드가 관련 제품의 다양한 제품군과 함께 작동해야 하지만
해당 제품의 구체적인 클래스에 의존하고 싶지 않을때 사용한다.
이번에는 실제 java 코드를 보면서 생각해보자.
xml 파일을 Document로 파싱해오는 예제코드중 일부이다.
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
netInstance를 하게되면 두가지 분기를 탄다.
1) getProperty를 해와서 팩토리 생성
2) DocumentBuilderFactoryImpl() 로 팩토리 생성
별다른 설정이 없다면 DocumentBuilderFactoryImpl 를 반환하다.
public static DocumentBuilderFactory newInstance()
throws FactoryConfigurationError {
// TODO Properties file and META-INF case missing here. See spec.
String factory = System
.getProperty("javax.xml.parsers.DocumentBuilderFactory");
if (factory != null) {
try {
return (DocumentBuilderFactory) Class.forName(factory)
.newInstance();
} catch (Exception ex) {
// Ignore.
}
}
try {
return new DocumentBuilderFactoryImpl();
} catch (Exception ex) {
// Ignore.
}
throw new FactoryConfigurationError(
"Cannot create DocumentBuilderFactory");
}
받아온 dbFactory (구현체)에서 newDocumentBuilder를 호출한다.
그러면 이또한 DocumentBuilderImpl를 호출하는데. DocumentBuilderImpl 클래스도 abstract class DocumentBuilder 를 상속받는 class이다.
public DocumentBuilder newDocumentBuilder()
throws ParserConfigurationException
{
try {
return new DocumentBuilderImpl(this, attributes);
} catch (SAXException se) {
// Handles both SAXNotSupportedException, SAXNotRecognizedException
throw new ParserConfigurationException(se.getMessage());
}
}
그리고 DocumentBuilderImpl가 가지는 parse 메서드.
public Document parse(InputSource is) throws SAXException, IOException {
if (is == null) {
throw new IllegalArgumentException(
DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN,
"jaxp-null-input-source", null));
}
if (fSchemaValidator != null) {
if (fSchemaValidationManager != null) {
fSchemaValidationManager.reset();
fUnparsedEntityHandler.reset();
}
resetSchemaValidator();
}
domParser.parse(is);
Document doc = domParser.getDocument();
domParser.dropDocumentReferences();
return doc;
}
하나의 Factory - Builder - parse 메서드가 하나의 셋트다. 같이 구현되어야 한다.
DocumentBuilderFactoryImp와 DocumentBuilderImp는 한 쌍이다.
근데 아래 코드에서는 Imp- 코드가 오던 아니면 내가 만든 Factory & Buider가 오던 상관이 없다. 그저 두개를 제대로 상속받아서 구현하면 된다.
이게 핵심인것같다.
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
- Factory로 끝나는 API는 거진 해당 패턴을 사용한다고 보면 되겠다.
'Today I learned' 카테고리의 다른 글
2021 08 25 개발자를 위한 코드 분석 방법 (JICA) 강의 수강 (0) | 2021.08.27 |
---|---|
2021 08 13 - Builder Pattern (0) | 2021.08.13 |
2021 08 10 - Factory Method (0) | 2021.08.10 |
UML(Unified Modeling Language) 훑어보기 (0) | 2021.08.10 |
Concurrency Patterns (0) | 2021.08.09 |
댓글