팩토리 패턴 정리
팩토리 패턴 정리
팩토리 패턴이란?
팩토리 패턴은 객체를 사용하는 코드에서 객체 생성 부분을 떼어내 추상화한 패턴이자 상속 관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를 결정하고, 하위 클래스에게 객체 생성에 관한 구채적인 내용을 결정하는 패턴이다. 즉 객체를 생성하는 인터페이스를 정의 함으로써, 어떤 인스턴스를 생성할지는 하위 클래스에서 결정하는 패턴이다.
상위 클래스와 하위 클래스가 분리되기 때문에 느슨한 결합을 가지며 상위 클래스에서는 인스턴스 생성 방식에 대해 전혀 알 필요가 없기 때문에 더 많은 유연성을 갖게 된다.(상위는 추상 클래스로 시작 하위는 상위 클래스를 확장하는 구상 클래스) 객체 생성 로직이 따로 분리되어 있기 때문에 코드를 수정할 때 다른 부분에 영향을 주지 않아 유지 보수가 간편하다.
모든 팩토리 패턴에서는 객체 생성을 캡슐화, 팩토리 메서드 패턴에서는 서브클래스에서 어떤 클래스를 만들지를 결정하게 함으로써 객체 생성을 캡슐화한다.
공통이 될 interface를 생성한다.
public interface Shape {
void draw();
}
인터페이스를 구현하는 클래스를 생성한다.
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Circle - draw()");
}
}
public class Triangle implements Shape {
@Override
public void draw() {
System.out.println("Triangle - draw()");
}
}
클래스의 객체를 생성하기 위해 Factory를 생성한다.
public class ShapeFactory {
// 구체적인 클래스 객체를 생성하기 위해 사용
public Shape getShape(String shapeType){
if(shapeType == null){
return null;
}
if(shapeType.equalsIgnoreCase("CIRCLE")){
return new Circle();
} else if(shapeType.equalsIgnoreCase("Triangle")){
return new Triangle();
} else{
return null;
}
}
}
Factory를 사용하여 type과 같은 정보를 전달하여 구체적인 클래스의 객체를 생성한다.
public class FactoryPatternPractice {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory();
// CIRCLE 생성
Shape shape1 = shapeFactory.getShape("CIRCLE");
shape1.draw();
// Triangle 생성
Shape shape2 = shapeFactory.getShape("Triangle");
shape2.draw();
}
}
Factory를 사용하여 type과 같은 정보를 전달하여 구체적인 클래스의 객체를 가진다.
결과
Circle - draw()
Triangle - draw()
팩토리 패턴의 장점
- 복잡한 오브젝트 생성 과정을 클라이언트가 직접 다룰 필요가 없다.
- 수정이 필요할 경우 팩토리 클래스 하나만 고치면 된다.
- 구조와 구현을 분리한다.
팩토리 메서드 패턴(Factory Methods Pattern) VS 추상 팩토리 패턴 (Abstract Factory Pattern)
추상 팩토리 패턴은 동일한 처리 로직의 하위 클래스의 결합을 통해 선택적으로 객체를 생성할 수 있는 장점이 있지만, 새로운 객체가 추가되면 하위 클래스에도 객체가 추가되어 확장 시 모든 하위 클래스의 수정해야 할 수도 있다.
팩토리 메서드 패턴은 1개의 하위 클래스(Factory) 내 매개변수를 통해 생성을 선택적으로 처리하여 다형성 갖는 거 같지만, 새로운 객체가 추가할 때마다 조건이 되는 로직을 추가해야 한다. 확장할수록 하위 클래스의 로직이 커져 유지보수가 어려워질 수 있다.
추상 팩토리 메서드 패턴은 클라이언트의 입장에서 클라이언트가 추상화된 인터페이스를 통해 객체를 생성하는 방식이지만 추상 팩토리 패턴은 관련 있는 여러 객체를 구체적인 클래스에 의존하지 않고 만들 수 있게 해 준다. 둘 다 구체적인 객체 생성 과정을 추상화한다.
추상 팩토리 패턴은 팩토리 메서드 패턴의 확장이라고 볼 수 있지만, 더 좋은 패턴이라고는 단정할 수 없다.