소개
- 서로 과련이 있는 여러 객체를 만들어주는 인터페이스
- 구체적으로 어떤 클래스의 인스턴스를 사용하는지 감출 수 있다.

1) 특징
- 팩토리 메서드와 흡사하게 객체 생성 과정을 추상화한 인터페이스를 제공한다.
- 팩토리 메서드는 팩토리의 구현에 초점을 둔다면 추상 팩토리는 팩토리를 사용하는 방법에 초점이 있다.
- 팩토리 메서드는 구체적인 객체 생성 자체를 하위 또는 구체 클래스로 이동시키는 것이 목적이다.
- 추상 팩토리 메서드는 여러 부품과도 같은 부분들에 대하여 구체적인 클래스가 아닌 추상화에 의존하는 것에 더 목적이 있다. 따라서 클래스나 인스턴스의 추가와 그에 따른 교체를 쉽게 하는것이 목적이다.
구현
- 여기에서는 자동차를 생산하는 공장의 예제를 생각한다.
- 아반떼와 소나타의 부품이 될 겉모양 Frame과 바퀴의 Wheel을 추상화해서 각각 아반떼와 소나타의 부품을 생성했다.
1) Frame 생성
인터페이스
public interface Frame {
void shape();
}
구현 클래스
public class AdvanteFrame implements Frame {
@Override
public void Shape() {
System.out.println("아반떼 프레임 생성");
}
}
public class SonataFrame implements Frame {
@Override
public void Shape() {
System.out.println("소나타 프레임 생성");
}
}
2) Wheel 생성
인터페이스
public interface Wheel {
void size();
}
구현 클래스
public class AvanteWheel implements Wheel {
@Override
public void size() {
System.out.println("아반떼 휠 사이즈: 17");
}
}
public class SonataWheel implements Wheel {
@Override
public void size() {
System.out.println("소나타 휠 사이즈: 19");
}
}
3) 팩토리
인터페이스
public interface CarFactory {
Frame createFrame();
Wheel createWheel();
}
구현 클래스
public class AvanteFactory implements CarFactory {
@Override
public Frame createFrame() {
return new AvanteFrame();
}
@Override
public Wheel createWheel() {
return new AvanteWheel();
}
}
public class SonataFactory implements CarFactory {
@Override
public Frame createFrame() {
return new SonataFrame();
}
@Override
public Wheel createWheel() {
return new SonataWheel();
}
}
4) 사용하기
Car 클래스
@Getter
public class Car {
private Frame frame;
private Wheel wheel;
public Car(Frame frame, Wheel wheel) {
this.frame = frame;
this.wheel = wheel;
}
}
Main 함수
public static void main(String[] args) {
CarFactory avanteFactory = new AvanteFactory();
Car avante = new Car(avanteFactory.createFrame(), avanteFactory.createWheel());
avante.getFrame().shape();
avante.getWheel().size();
CarFactory sonataFactory = new SonataFactory();
Car sonata = new Car(sonataFactory.createFrame(), sonataFactory.createWheel());
sonata.getFrame().shape();
sonata.getWheel().size();
}