지난 학습에서 Template Method 패턴이
상위 클래스에서 처리 골격을 만들고
하위 클래스에서 구체적인 처리를 하는 것을 확인하였는데
오늘의 학습 주제인 Factory Method Pattern은
인스턴스를 생성하는 공장을
Template Method 패턴으로 구성한 것입니다
템플릿 메소드 패턴에 대해 궁금하시다면
아래의 링크↓↓
2020/06/11 - [Java] - [Design Pattern] 템플릿 메소드 패턴(Template Method Pattern)
아래의 표는 팩토리 메소드 패턴을 구성하는
역할들을 정리한 것입니다
역할 | 설명 |
제품(Product) | 인스턴스가 가져야 할 인터페이스를 결정 |
작성자(Creator) | new를 사용한 인스턴스 생성 대신 메소드를 호출해서 클래스 이름에 의한 속박에서 상위 클래스를 자유롭게 함 |
구체적인 제품(Concrete Product) | 구체적인 제품을 결정 |
구체적인 작성자(Concrete Creator) | 구체적인 제품을 만드는 클래스를 결정 |
역시 글만으로는 확실히 감이 안오네요-_-
자 이제 실제로 구현해보겠습니다
1. 추상 클래스(Abstract Class) Factory.java
package factoryMethodPattern.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);
}
2. 추상 클래스(Abstract Class) Product.java
package factoryMethodPattern.framework;
public abstract class Product {
public abstract void use();
}
3. 클래스(Class) IDCard.java
package factoryMethodPattern.idCard;
import factoryMethodPattern.framework.*;
public class IDCard extends Product {
private String owner;
IDCard(String owner) {
System.out.println("make " + owner + "'s card");
this.owner = owner;
}
public void use() {
System.out.println("use " + owner + "'s card");
}
public String getOwner() {
return owner;
}
}
4. 클래스(Class) IDCardFactory.java
package factoryMethodPattern.idCard;
import java.util.*;
import factoryMethodPattern.framework.*;
public class IDCardFactory extends Factory {
private List<String> owners = new ArrayList<String>();
protected Product createProduct(String owner) {
return new IDCard(owner);
}
protected void registerProduct(Product product) {
owners.add(((IDCard)product).getOwner());
}
public List getOwners() {
return owners;
}
}
5. 클래스(Class) Test.java
import factoryMethodPattern.framework.*;
import factoryMethodPattern.idCard.*;
public class Test {
public static void main(String[] args) {
/* Factory Method Pattern */
Factory factory = new IDCardFactory();
Product card1 = factory.create("Cameron");
Product card2 = factory.create("Ben");
Product card3 = factory.create("July");
card1.use();
card2.use();
card3.use();
}
}
위의 코드를 살펴보면
factoryMethodPattern.framework 패키지에
두 개의 추상 클래스가 있고
이 두 클래스가 인스턴스 생성을 위한
골격의 역할을 합니다
factoryMethodPattern.idCard 패키지에
두 개의 클래스는
실제로 구체적인 구현을 합니다
자세히 보면
factoryMethodPattern.framework 패키지에서
factoryMethodPattern.idCard 패키지를
import하지 않기 때문에
새로운 Product와 Factory를 추가하더라도
framework는 수정할 필요가 없습니다
이 패턴 역시 지난 시간의 템플릿 메소드 패턴과
마찬가지로 소스를 이해하지 못하면
본래 의도했던 바와 다르게
수정이 가해질 가능성이 생기게됩니다
지금까지 팩토리 메소드 패턴에 대해
학습했는데 추후에 학습할 Composite 패턴을
Product 역할이나 Concrete Product 역할에
적용할 수도 있습니다
지금까지 학습했던 내용이
기억안나신다면 아래의 링크↓↓
2020/06/08 - [Java] - [Design Pattern] 반복자 패턴(Iterator Pattern)
2020/06/09 - [Java] - [Design Pattern] 어댑터 패턴(Adapter Pattern)
이것으로 오늘의 학습을 마치고
다음 시간에 Singleton은 하나의 인스턴스만 갖는
Singleton 패턴에 대해 학습하겠습니다
그럼 이만-_-
'Java' 카테고리의 다른 글
[Design Pattern] 빌더 패턴(Builder Pattern) (0) | 2020.06.15 |
---|---|
[Design Pattern] 싱글톤(Singleton) 패턴과 프로토타입(Prototype) 패턴 (0) | 2020.06.14 |
[Design Pattern] 템플릿 메소드 패턴(Template Method Pattern) (0) | 2020.06.11 |
[Design Pattern] 어댑터 패턴(Adapter Pattern) (0) | 2020.06.09 |
[Design Pattern] 반복자 패턴(Iterator Pattern) (0) | 2020.06.08 |