책 [JAVA 언어로 배우는 디자인 패턴 입문 3판;유키 히로시 저]을 참고하여 작성하였습니다.
인스턴스를 생성하는 공장(factory)을 Template Method 패턴으로 구성한 것
인스턴스 생성 방법을 상위 클래스에서 결정하되, 구체적인 클래스 이름까지 결정하지 않는다.
구체적인 것은 모두 하위 클래스에서 붙임으로써 인스턴스 생성을 위한 뼈대(프레임워크)와 실제 인스턴스를 생성하는 클래스를 나누어 생각한다.
상위 클래스 | 하위 클래스 |
추상적인 뼈대, 프레임워크 | 실제 구현부 |
Product 프레임워크, 이 패턴으로 생성되는 인스턴스가 가져야 할 인터페이스(API)를 결정하는 추상 클래스
Creator 프레임워크, Product 역을 생성하는 추상 클래스, Creator 역은 실제로 생성할 ConcreteProduct 역에 대해 아는 바가 없다, new를 사용해 실제 인스턴스를 생성하는 대신에, 인스턴스를 생성하는 메서드를 호출함으로써 구체적인 클래스 이름에 의한 속박에서 상위 클래스를 자유롭게 한다.
ConcreteProduct 구현부, 구체적인 제품을 결정한다.
ConcreteCreator 구현부, 구체적인 제품을 만들 클래스를 결정한다.
>> 새로운 제품과 새로운 공장을 만들 때 기존의 framework를 변경할 필요가 없다. framework 패키지는 구체 패키지(ex. 여기서는 idcard 패키지)에 의존하지 않는다.

package framework;
public abstract class Factory { // 구체 클래스에 대한 정보가 전혀 들어가지 않았다.
public final Product create(String owner) {
Product p = createProduct(owner);
registerProduct(p);
return p;
}
protected abstract Product createProduct(String owner); // 하위 클래스에서 구현
protected abstract void registerProduct(Product product); // 하위 클래스에서 구현
}
package idcard;
public class IDCardFactory extends Factory {
@Override
protected Product createProduct(String owner) {
return new IDCard(owner);
}
@Override
protected void registerProduct(Product product) {
System.out.println(product + "을 등록했습니다.");
}
}
static Factory Method
- 인스턴스 생성을 위한 클래스 메서드(static 메서드)를 Factory Method라고 부르는 경우가 있다.
- GoF의 Factory Method와는 다르지만 Java에서 인스턴스를 생성할 때 매우 자주 사용되는 기법
- Java API 레퍼런스에서도 인스턴스 생성을 위한 클래스 메서드를 static Factory Method라고 지칭함
- create, newInstance, getInstance ...
// 1. java.security.SecureRandom의 getInstance()
// 난수 생성 알고리즘 이름을 지정해서 SecureRandom 인스턴스 생성
SecureRandom random = SecureRandom.getInstance("NativePRNG");
// 2. java.util.List의 of()
// 구체적인 요소를 주면 List 인스턴스 생성
List<String> list = List.of("Alice", "Bob", "Chris");
// 3. java.util.Arrays의 asList()
// 지정된 배열이나 열거한 요소로부터 List 인스턴스 생성
String[] arr = {"Alice", "Bob", "Chris"};
List<String> list1 = Arrays.asList(arr);
List<String> list2 = {"Alice", "Bob", "Chris"};
// 4. java.lang.String의 valueOf()
// 다양한 형태의 문자열 표현 생성
String string = String.valueOf('A');
// 5. java.time.Instant의 now()
// 현재 시간을 나타내는 Instant의 인스턴스를 생성
Instant instant = Instant.now();
'문제 및 이론 정리 > 디자인패턴' 카테고리의 다른 글
[디자인패턴] Facade - 단순한 창구를 만든다 (0) | 2025.03.05 |
---|---|
[디자인패턴] State - 상태를 클래스로 표현한다 (0) | 2025.02.25 |
[디자인패턴] Composite - 그릇과 내용물을 동일시한다 (0) | 2025.02.23 |
[디자인패턴] Proxy - 필요해지면 만든다 (0) | 2025.02.22 |
[디자인패턴] Decorator - 장식틀과 내용물을 동일시한다 (0) | 2025.02.21 |