디자인 패턴 공부
[디자인 패턴] 팩토리 메서드 패턴
개발자가 말대꾸?
2022. 11. 21. 02:56
팩토리메서드는 부모 클래스에서 객체를 생성하는 인터페이스를 제공하고, 자식 클래스들이 생성될 객체들의 유형을 변경할 수 있도록 하는 생성패턴입니다.
문제
트럭 운송만 처리 가능한 대부분의 코드가 'Truck' Class에 있습니다.
얼마 후 해상 물류 기능을 추가해 달라는 요청이 수십 개씩 받기 시작했다고 가정해 봅시다.
현재 대부분의 소스코드가 'Truck' Class에 결합되어 있기 때문에 'Ship' Class를 추가하려면 전체 코드 베이스를 변경해야 할 것입니다.
해결
운송 매체에 관한 인터페이스 'Transport'를 만들고 'Truck'와 'Ship' 등 수단 클래스가 Transport를 구현시키게 합니다.
Truck과 Ship은 각각 트럭 운송, 해양 운송을 맡게됩니다.
예시
public interface Animal {
void move();
void onmove();
}
Animal 인터페이스를 선언합니다.
public class Rabbit implements Animal {
@Override
public void move() {
System.out.println("[Move] Rabbit !!");
onmove();
}
@Override
public void onmove() {
System.out.println("[OnMove] Rabbit !!");
}
}
public class Turtle implements Animal {
@Override
public void move() {
System.out.println("[Move] Turtle !!");
onmove();
}
@Override
public void onmove() {
System.out.println("[OnMove] Rabbit !!");
}
}
Animal 인터페이스를 구현하는 Rabbit과 Turtle을 만듭니다.
public abstract class Transport {
public void onmoveAnimal() {
Animal animal = createAnimal();
animal.move();
}
public abstract Animal createAnimal();
}
가상 클래스인 Transport를 만듭니다.
Transport를 상속한 클래스는 createAnimal을 구현하거나 abstract하게 선언해야합니다.
public class RabbitTransport extends Transport {
@Override
public Animal createAnimal() {
return new Rabbit();
}
}
public class TurtleTransport extends Transport {
@Override
public Animal createAnimal() {
return new Turtle();
}
}
RabbitTransport는 Rabbit 인스턴스를 반환하고, TurtleTransport는 Turtle을 반환합니다.
public class Main {
static final String favoriteAniaml = "Rabbit";
// static final String favoriteAniaml = "Turtle";
private static Transport transport;
public static void main(String[] args) {
configure();
run();
}
static void configure() {
transport = switch (favoriteAniaml) {
case "Rabbit" -> new RabbitTransport();
case "Turtle" -> new TurtleTransport();
default -> null;
};
}
static void run() {
transport.onmoveAnimal();
}
}