- Factory Method 패턴 : 하위 클래스에서 인스턴스를 만든다
Factory Method 패턴은 부모 클래스에서 객체들을 생성할 수 있는 인터페이스를 제공하지만, 자식 클래스들이 생성될 객체들의 유형을 변경할 수 있도록 하는 생성 패턴이다.
인스턴스 생성을 위한 뼈대와 실제 인스턴스를 생성하는 클래스를 나누어 생각할 수 있다.
- 어떤 경우에 사용할까?
factory는 '공장'이라는 의미로, 인스턴스를 생성하는 공장을 Template Method 패턴으로 구성한 것이 Factory Method 패턴이다. 이 패턴은 인스턴스 생성과 구현을 분리하는데 의의를 둔다.
- 예제 코드
패키지 | 이름 | 설명 |
framework | Product | 추상 메서드 use만 정의한 추상 클래스 |
framework | Factory | 메서드 create를 구현한 추상 클래스 |
idcard | IDCard | 메서드 use를 구현한 클래스 |
idcard | IDCardFactory | 메서드 createProduct, registerProduct를 구현한 클래스 |
이름 없음 | Main | 동작 테스트용 클래스 |
- Product 클래스
package factoryMethod.framework;
public abstract class Product {
public abstract void use();
}
- Factory 클래스
package factoryMethod.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);
}
- IDCard 클래스
package factoryMethod.idcard;
import factoryMethod.framework.Product;
public class IDCard extends Product {
private String owner;
public IDCard(String owner) {
System.out.println(owner + "의 카드를 만듭니다.");
this.owner = owner;
}
@Override
public void use() {
System.out.println(this + "을 사용합니다.");
}
@Override
public String toString() {
return "IDCard [owner=" + owner + "]";
}
public String getOwner() {
return owner;
}
}
- IDCardFactory 클래스
package factoryMethod.idcard;
import factoryMethod.framework.Factory;
import factoryMethod.framework.Product;
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 + "을 등록했습니다.");
}
}
- Main 클래스
package factoryMethod;
import factoryMethod.framework.Factory;
import factoryMethod.framework.Product;
import factoryMethod.idcard.IDCardFactory;
public class Main {
public static void main(String[] args) {
Factory factory = new IDCardFactory();
Product card1 = factory.create("Youngjin Kim");
Product card2 = factory.create("Heungmin Son");
Product card3 = factory.create("Kane");
card1.use();
card2.use();
card3.use();
}
}
참고문헌 : 유키 히로시 저/김성훈 역(2022), JAVA 언어로 배우는 디자인 패턴 입문, 영진닷컴
참고자료 : https://refactoring.guru/ko/design-patterns/factory-method