'JAVA 언어로 배우는 디자인 패턴 입문'의 내용을 정리한 것입니다.
Factory Method 패턴
- 인스턴스를 생성하는 공장을 Template Method 패턴으로 구성한 것이 Factory Method 패턴이다.
- Factory Method 패턴에서는 인스턴스 생성 방법을 상위 클래스에서 결정하고, 구체적인 클래스 이름까지는 결정하지 않는다.
- 인스턴스 생성을 위한 뼈대와 실제 인스턴스를 생성하는 클래스를 나누어 생각할 수 있게 된다.
예제 프로그램
신분증 카드(ID 카드)를 만드는 공장을 소재로 했다.
Product 클래스와 Factory 클래스는 인스턴스를 생성하는 뼈대 역할을 하며, framework 패키지에 속해 있다.
IDCard 클래스와 IDCardFactory 클래스는 뼈대에 살을 붙여 구체적인 내용을 구현한다.
Product 클래스
public abstract class Product {
public abstract void use();
}
Factory 클래스
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 클래스
@Getter
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 + "]";
}
}
IDCardFactory 클래스
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 클래스
public class Main {
public static void main(String[] args) {
Factory factory = new IDCardFactory();
Product card1 = factory.create("hong");
Product card2 = factory.create("kim");
Product card3 = factory.create("lee");
card1.use();
card2.use();
card3.use();
}
}
[실행 결과]
hong의 카드를 만듭니다.
[IDCard:hong]을 등록했습니다.
kim의 카드를 만듭니다.
[IDCard:kim]을 등록했습니다.
lee의 카드를 만듭니다.
[IDCard:lee]을 등록했습니다.
[IDCard:hong]을 사용합니다.
[IDCard:kim]을 사용합니다.
[IDCard:lee]을 사용합니다.
Product(제품) 역
- 이것이 프레임워크 쪽이다.
- 이 패턴으로 생성되는 인스턴스가 가져야 할 인터페이스(API)를 결정하는 추상 클래스이다.
- 구체적인 내용은 하위 클래스 ConcreteProduct에서 결정한다.
- Product 클래스가 이 역할
Creator(작성자) 역
- 이것은 프레임워크 쪽이며 Product 역을 생성하는 추상 클래스이다.
- 구체적인 내용은 하위 클래스 ConcreteCreator가 결정한다.
- Factory 클래스가 이 역할
- Creator 역은 실제로 생성할 ConcreteProduct 역에 대해서는 아는 바가 없다.
- Creator 역이 아는 것은 Product 역과 인스턴스 생성 메소드를 호출하면 Product가 생성된다는 것뿐이다.
- new를 사용해 실제 인스턴스를 생성하는 대신에, 인스턴스를 생성하는 메소드를 호출함으로써 구체적인 클래스 이름에 의한 속박에서 상위 클래스를 자유롭게 한다.
ConcreteProduct(구체적인 제품) 역
- 구체적인 제품을 결정
- IDCard 클래스가 이 역할
ConcreateCreator(구체적인 작성자) 역
- 구체적인 살을 붙이는 쪽
- IDCardFactory 클래스가 이 역할
정리
- 객체 생성에 관련해서 추상 메소드로 정의하고 실제 객체 생성은 하위 클래스에서 한다.
반응형