팩토리 메서드 패턴과 추상 팩토리 패턴 차이점
추상 팩토리(Abstract factory) 패턴이란?
- 관련있는 여러 객체를 만들어주는 추상화된 형태로 정의한 인터페이스
- 팩토리 메서드 패턴과 굉장히 흡사하지만 팩토리를 사용하는 클라이언트가 추가된 패턴
예제 코드
이전 팩토리 메서드에서 Soju 클래스에 Design 클래스가 추가되었다고 가정한다면
public class Soju {
private String name;
private Design design;
public Design getAddress() {
return design;
}
public void setAddress(Design design) {
this.design = design;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//아래 코드는 클라이언트 코드에 해당됨
public class GoodDaySojuFactory implements SojuFactory {
@Override
public Soju createSoju() {
GoodDaySoju goodDaySoju = new GoodDaySoju();
goodDaySoju.setDesign(new Design());
return goodDaySoju;
}
}
클라이언트 코드가 구체적인 클래스에 의존하고 있는것을 볼수있다.
Design을 만들어주는 추상 팩토리 인터페이스 정의
public interface SojuDesignFactory {
Design createDesign();
}
public interface Design {} // 기존 클래스를 인터페이스로 변경
추상 팩토리의 구체적인 팩토리 정의
public class GoodDaySojuDesignFactory implements SojuDesignFactory {
@Override
public Design createDesign() {
return new GoodDayDesign();
}
}
public class GoodDayDesign implements Design {}
추상 팩토리를 사용하도록 클라이언트 코드를 수정
public class GoodDaySojuFactory implements SojuFactory {
private SojuDesignFactory sojuDesignFactory;
public GoodDaySojuFactory(SojuDesignFactory sojuDesignFactory) {
this.sojuDesignFactory = sojuDesignFactory;
}
@Override
public Soju createSoju() {
GoodDaySoju goodDaySoju = new GoodDaySoju();
goodDaySoju.setDesign(sojuDesignFactory.createDesign());
return goodDaySoju;
}
}
위 코드는 이제 디자인이 변경되더라도 코드가 바뀔 일이 없다.
한정판 디자인이 생겼다고 가정
public class GoodDayDesignEdition implements Design{ } // 한정판 디자인 클래스 생성
//GoodDayDesignEdition 객체를 생성하는 팩토리 작성
public class GoodDaySojuDesignEditionFactory implements SojuDesignFactory {
@Override
public Design createDesign() {
return new GoodDayDesignEdition();
}
}
사용 코드
public static void main(String[] args) {
SojuFactory sojuFactory = new GoodDaySojuFactory(new GoodDaySojuDesignEditionFactory()); // GoodDaySojuDesignEditionFactory
Soju goodDayDesignEdition = sojuFactory.orderSoju();
System.out.println(goodDayDesignEdition.getDesign().getClass() + " ," + goodDayDesignEdition.getName()); // class GoodDayDesignEdition ,GoodDay
SojuFactory sojuFactory2 = new GoodDaySojuFactory(new GoodDaySojuDesignFactory()); // GoodDaySojuDesignFactory
Soju goodDayDesign = sojuFactory2.orderSoju();
System.out.println(goodDayDesign.getDesign().getClass() + " ," + goodDayDesign.getName()); // class GoodDayDesign ,GoodDay
}
밖에서 어떤 팩토리를 넣어주냐에 따라 Soju 객체가 달라지지만 핵심 코드는 변경되지 않음을 알 수 있다.
요약 정리
- 팩토리 메서드패턴은 객체 생성의 관점 즉 팩토리를 구현하는 방법에 좀 더 집중되어있고, 추상 팩토리 패턴은 그러한 팩토리를 사용하는 관점에 좀 더 집중되어있다.
- 팩토리 메서드 패턴은 구체적인 객체 생성 과정을 구체적인 구현 클래스로 옮기는 것
- 추상 팩토리 패턴은 객체에 관련있는 다른 여러 객체를 구체적인 클래스에 의존하지 않고 만들 수 있게 해주는 것