추상 팩토리 패턴이라는 이름만 봐서는 팩토리 메서드 패턴인데 추상이 추가된건가? 라는 생각이 드실 수 있습니다.
명확한 차이점은
추상 팩토리 패턴은 어떻게 보면, 팩토리 메서드 패턴을 좀 더 캡슐화한 방식이라고 볼 수 있습니다.
public interface CarPartsFactory {
Handle createHandle();
Wheel createWheel();
}
현재 Client의 코드 부분의 수정은 Wheel, Handle 같은 Parts들을 만드는 곳에서 발생한다. 하여 위와 같이 각 Parts들(Handel, Wheel)을 interface로 만든 뒤, 각 Part들을 만들어 반환하는 interface를 정의합니다.
실제 팩토리 만들기
public class WhiteCarPartsFactory implements CarPartsFactory{
@override
public Handle createHandle() {
return new WhiteHandle();
}
@override
public Wheel createWheel() {
return new WhiteWheel();
}
}
추상 팩토리를 implements하게 하여 팩토리를 구체화한다.
해당 Factory는 WhiteHandle, WhiteWheel을 위한 팩토리이다.
Client
이제 생성자에서 이를 구체화 해보겠습니다.
public Car createCar() {
Car car = new Car();
car.setHandle(carPartsFactory.createHandle());
car.setWheel(carPartsFactory.createWheel());
return car;
Handle과 Wheel을 set하는 부분이 구체적인 클래스에서 인터페이스에 의존함으로써 결합력이 느슨해진 것을 알 수 있습니다.
팩토리 메서드 패턴 : 인스턴스를 만드는 과정에 집중이 되어 있다.
추상 팩토리 메서드 패턴 : 클라이언트의 입장에서 클라이언트가 추상화된 인터페이스를 통해 객체를 생성할 수 있도록 해준다.
공통점 : 둘 다 구체적인 객체 생성 과정을 추상화한 인터페이스를 제공한다.
팩토리 메서드 패턴은 팩토리를 구현하는 방법에 초점을 두고
추상 팩토리 메서드 패턴은 팩토리를 사용하는 방법에 초점을 둔다
팩토리 메서드 패턴은 구체적인 인스턴스 생성 과정을 하위 또는 구체적인 클래스로 옮기는 것이 목적이고, 추상 팩토리 패턴은 관련있는 여러 객체를 구체적인 클래스에 의존하지 않고 만들 수 있게 해주는 것이 목적이다.