Factory Method Pattern
- 인스턴스 생성 방법을 상위 클래스에서 결정하되, 구체적인 클래스 이름은 결정하지 않는다.
- 인스턴스 생성을 위한 뼈대(프레임워크)와 실제 인스턴스를 생성하는 클래스를 나누어 생각할 수 있다.
Factory Method Pattern 예제
- 신분증 카드를 만드는 공장
- `Product` 추상 메서드 use만 정의한 추상 클래스
- `Factory` 메서드 create를 구현한 추상 클래스
- `IDCard` 메서드 use를 구현한 클래스
- `IDCardFactory` 메서드 createProduct, registerProduct를 구현한 클래스
- `Main` 동작 테스트용 클래스
Product 클래스
package factory_method.framework;
public abstract class Product {
public abstract void use();
}
Factory 클래스
package factory_method.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 factory_method.idcard;
import factory_method.framework.Product;
public class IDCard extends Product {
private String owner;
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 + "]";
}
public String getOwner() {
return owner;
}
}
IDCardFactory 클래스
package factory_method.idcard;
import factory_method.framework.Factory;
import factory_method.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 factory_method;
import factory_method.framework.Factory;
import factory_method.framework.Product;
import factory_method.idcard.IDCardFactory;
public class Main {
public static void main(String[] args) {
Factory factory = new IDCardFactory();
Product card1 = factory.create("jiseon");
Product card2 = factory.create("jiseon2");
Product card3 = factory.create("jiseon3");
}
}
Factory Method 패턴의 등장인물
Product(제품)
- 이 패턴으로 생성되는 인스턴스가 가져야 할 인터페이스를 결정하는 추상 클래스
- 구체적인 내용은 하위 클래스 ConcreteProduct에서 결정한다.
- 위 예제에서는 Product 클래스에 해당한다.
Creator(작성자)
- Product를 생성하는 추상 클래스
- 구체적인 내용은 하위 클래스 ConcreteCreator가 결정한다.
- 위 예제에서는 Factory 클래스에 해당한다.
ConcreteProduct(구체적인 제품)
- 구체적인 제품을 결정한다.
- 위 예제에서는 IDCard 클래스에 해당한다.
ConcreteCreator(구체적인 작성자)
- 구체적인 제품을 만들 클래스를 결정한다.
- 위 예제에서는 IDCardFactory 클래스에 해당한다.
'Design' 카테고리의 다른 글
디자인패턴 :: Singleton Pattern (0) | 2024.07.08 |
---|---|
디자인패턴 :: Template Method Pattern (0) | 2024.07.05 |
디자인패턴 :: Iterator Pattern (0) | 2024.07.05 |