디자인 패턴

팩토리 메소드 패턴(2) - 인터페이스 적용하기, 장점과 단점

깊게 생각하고 최선을 다하자 2022. 9. 1. 15:56

1) 인터페이스 적용하기-

클라이언트의 코드도 다음과 같이 변경을 최소화할 수 있습니다. 

[Client 클래스]

public class Client {

    public static void main(String[] args){
       Client client = new Client();
       client.print(new WhiteshipFactory(), "whiteship", "keesun@gmail.com");
       client.print(new BlackshipFactory(), "blackship", "keesun@gmail.com");
    }
    
    private void print(ShipFactory shipFactory, String name, String email){
       System.out.println(shipFactory.orderShip(name, email));
    }
    
}

- 혹은 클래스를 별도로 빼내면 의존 관계 주입(Dependency Injection)이라고 볼 수도 있습니다. 

 

 

2) 자바 8 버전을 쓴다면

- 자바 8 버전을 쓴다면 인터페이스에서 private 메소드 사용이 불가능합니다. 

  이러한 경우는 기존 private 메소드를 추상 메소드로 정의하고,

  중간에 DefaultShipFactory 추상 클래스를 추가해서 해결할 수 있습니다. 

 

[ShipFactory 인터페이스]

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

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


}

[DefaultShipFactory 클레스]

public abstract class DefaultShipFactory implements ShipFactory {

    @Override
    public void sendEmailTo(String email, Ship ship){
        System.out.println(ship.getName() + " 다 만들었습니다.");
    }
}

[BlackshipFactory 클래스]

public class BlackshipFactory extends DefaultshipFactory {

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

[WhiteshipFactory 클래스]

public class WhiteshipFactory extends DefaultshipFactory {

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

- 중요한 건 제품군과 Factory 둘 다 계층구조가 있다는 점입니다. 

   따라서 구체적인 클래스 안에서 구체적인 제품을 만들어냅니다. 

 

 

2) 팩토리 메소드 패턴 복습

(1) 팩토리 메소드 패턴을 적용했을 때의 장점과 단점은?

- 팩토리 메소드 패턴의 장점은 기존 코드를 건드리지 않고 새로운 코드의 확장이 가능하다는 점입니다.

  기존 코드를 건드리지 않기 때문에 코드가 간결해지고, 복잡해지지 않습니다.

  반면, 단점은 클래스가 늘어난다는 점입니다. 

 

(2) "확장에 열려있고 변경에 닫혀 있는 객체 지향 원칙"을 설명하세요

- 변경에 닫혀 있다는 것은 기존 코드를 변경하지 않는다는 것입니다. 

  변경하지 않으면서 새로운 기능을 얼마든지 확장할 수 있는 구조를 만들 수 있습니다. 

 

(3) 자바 8에 추가된 default 메소드에 대해 설명하세요.

- 자바 8 이전에는 인터페이스에는 추상 메소드만 정의할 수 있었습니다. 

   자바 8부터는 인터페이스에 기본 구현체를 만들 수 있습니다.

   그리고 인터페이스를 구현하는 클래스나 상속 받는 클래스가 

   해당 기능을 사용할 수 있습니다. 

-> 따라서 자바 8이후에는 추상클래스보다는 인터페이스를 많이 사용합니다.

 

 

참고

백기선 코딩으로 학습하는 GoF의 디자인 패턴