Factory Method Pattern은 부모 클래스에서 객체들을 생성할 수 있는 인터페이스를 제공하며, 자식 클래스들이 생성될 객체 등의 유형을 변경할 수 있도록 하는 생성 패턴이다.
그렇기 때문에 자식 클래스들은 팩토리 메서드가 반환하는 객체들의 클래스를 변경할 수 있다.
기존 코드의 변경 없이 확장하기 위한 디자인 패턴이며, 객체를 생성할 때 어떤 클래스의 인스턴스를 만들지 서브 클래스에서 결정하여 즉, 인스턴스 생성을 서브 클래스에 위임한다.
아래와 같은 예시로 사용법을 알아보겠다.
//제품 객체 추상화
interface IProduct{
void setting();
}
//제품 구현체
class ConcreteProductA implements Iproduct{
public void setting(){
}
}
class ConcreteProductB implements Iproduct{
public void setting(){
}
}
- IProduct 객체를 인터페이스로 추상화한다.
ConcreteProductA,ConcreteProductB로 상속받는다.
//공장 객체 추상화
abstract class AbstractFactory{
//객체 생성 전처리 후처리 메서드
final Iproduct createOperation(){
Iproduct product = createProduct();
product.setting();
return product;
}
//팩토리 메서드: 구체적인 객체 생성 종류는 각 서브 클래스에 위임
abstract protected IProduct createProduct();
}
class ConcreteFactoryA extends AbstractFactory{
@Override
public IProduct createProduct(){
return new ConcreateProductA();
}
}
class ConcreteFactoryB extends AbstractFactory{
@Override
public IProduct createProduct(){
return new ConcreateProductB();
}
}
- Factory 객체를 추상 클래스로 선언한다.
- Final IProduct로 제품 객체를 생성하고 추가 생성 및 product를 반환한다.
ConcreteFactoryA와ConcreteFactoryB를 추상 클래스를 확장하여 선언하고 각각 productA와 productB를 반환한다.
class Client{
public static void main(String[] args){
// 1. 공장 객체 생성
AbstractFactory[] factory = {
new ConcreteFactoryA(),
new ConcreteFactoryB()
};
}
// 2. productA 생성
IProduct productA = factory[0].createOperation();
// 3. productB 생성
IProduct productB = factory[1].createOperation();
}
https://inpa.tistory.com/entry/GOF-💠-팩토리-메서드Factory-Method-패턴-제대로-배워보자#thankYou
https://bcp0109.tistory.com/367