디자인 패턴 공부

[디자인 패턴] 팩토리 메서드 패턴

개발자가 말대꾸? 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();
    }
}