팩토리 메서드 패턴이란?

<aside> 💡 구체적으로 어떤 인스턴스를 만들지는 서브 클래스(인터페이스)가 정한다.

</aside>

Untitled

팩토리 메서드 패턴의 구성 요소

  1. Creator (생성자): 객체를 생성하는 추상 클래스로, 팩토리 메서드를 정의합니다. 이 메서드는 일반적으로 추상 메서드로 선언되며, 이를 상속받은 구체적인 생성자가 실제 객체 생성을 담당합니다.
  2. ConcreteCreator (구체적 생성자): Creator 클래스를 상속받아 팩토리 메서드를 구현하는 클래스입니다. 이 클래스는 필요한 객체를 실제로 생성합니다.
  3. Product (제품): 생성자에 의해 생성되고, ConcreteCreator에 의해 반환되는 객체의 인터페이스 또는 추상 클래스입니다.
  4. ConcreteProduct (구체적 제품): 구체적 생성자가 생성하는, 실제 객체를 나타내는 클래스입니다.

코드 설명

public interface ShipFactory {
    default Ship orderShip(String name, String email) {
        //validate
        validate(name,email);
        prepareFor(name);
        Ship ship = createShip();
        sendEmailTo(email, ship);
        return ship;
    }

    Ship createShip();

    private void validate(String name,String email){
        if (name == null || name.isBlank()) {
            throw new IllegalArgumentException("배 이름을 지어주세요.");
        }
        if (email == null || email.isBlank()) {
            throw new IllegalArgumentException("연락처를 남겨주세요.");
        }
    }

    private static void prepareFor(String name) {
        System.out.println(name + " 만들 준비 중");
    }

    private static void sendEmailTo(String email, Ship ship) {
        System.out.println(ship.getName() + " 다 만들었습니다.");
    }
}
public class BlackShip extends Ship{

    public BlackShip(){
        setName("blackship");
        setLogo("⚓");
        setColor("black");
    }
}

public class BlackShipFactory implements ShipFactory{

    @Override
    public Ship createShip() {
        return new BlackShip();
    }
}

public class WhiteShip extends Ship{

    public WhiteShip(){
        setName("whiteship");
        setLogo("\\uD83D\\uDEE5");
        setColor("white");
    }
}

public class WhiteShipFactory implements ShipFactory{

    @Override
    public Ship createShip() {
        return new WhiteShip();
    }
}