본문 바로가기

디자인 패턴

팩토리 메소드 패턴(1) - 개념, 패턴 적용

1) 팩토리 메소드 패턴이란?

- 팩토리 메소드 패턴이란 어떤 인스턴스를 생성하는 책임을 구체 클래스가 아닌

  추상적인 인터페이스의 메소드로 감싸는 것을 의미합니다. 

 

- 다양한 구현체(Product)가 있고, 그 중에서 특정한 구현체를 만들 수 있는 다양한 팩토리(Creator)를 

   제공할 수 있습니다. 

- 예를 들어, whiteship이라는 배만 만들던 공장이 있는데, 사업이 잘 되어서

  추후에 blackship이라는 것도 만들게 됩니다. 

  이 때, 기존에 있던 orderShip 메소드에 if~else문으로 조건을 추가하면서 코드가 복잡해집니다. 

  혹은 Ship 클래스가 변경될 수도 있습니다.(즉, 변경에 닫혀 있지 않습니다)

-> 그래서 우리는 추상화되어 있는 Factory를 만듭니다. 

 

-- 팩터리 메소드 패턴 사용 전 --

[Client 클래스]

public class Client{

   public static void main(String[] args){
       Client client = new Client();
       
       Ship whiteship = ShipFactory.orderShip("whiteship", "keesun@gmail.com");
       System.out.println(whiteship);
   
       Ship blackship = ShipFactory.orderShip("blackship", "keesun@gmail.com");
       System.out.println(blackship);
   }
}

[Ship 클래스]

public class Ship{

    private String name;
    
    private String color;
    
    private String logo;
    
    public String getName() { return name; }
    
    public void setName() { this.name = name; }
    
    public String getColor() { return color; }
    
    public void setColor() { this.color = color;}
    
    public String getLogo() { return logo; }
    
    public void setLogo() { this.logo = logo;}
    
}

[ShipFactory 클래스]

 

public class ShipFactory{

    public static Ship orderShip(String name, String email){
    
       if(name == null || name.isBlank()){
          throw new IllegalArgumentException("배 이름을 지어주세요.");
       }
       
       if(email == null || email.isBlank()){
          throw new IllegalArgumentException("연락처를 남겨주세요.");
       }
    
       Ship ship = new Ship();
       ship.setName(name);
       
       if(name.equalsIgnoreCase("whiteship")){
          ship.setLogo("\u0830\uDEE5");
       }else if(name.equalsIgnoreCase("blackship")){
          ship.setLogo(" ");
       }
       
       if(name.equalsIgnoreCase("whiteship")){
          ship.setColor("white");
       }else if(name.equalsIgnoreCase("blackship")){
          ship.setColor("black");
       }
       
       sendEmailTo(email, ship);
    
       return ship;
    }
    
}

 

-- 팩토리 메소드 패턴 적용 후--

[ShipFactory 인터페이스] 

public interface ShipFactory{
  
    default Ship orderShip(String name, String email){
        validate(email);
        prepareFor(name);
        Ship ship = createShip();
        sendEmailTo(email, ship);
        return ship; 
    }
    
    private void sendEmailTo(String email, Ship ship){
        System.out.println(ship.getName() + " 다 만들었습니다.");
    }
    
    Ship createShip()

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


}

[WhiteShipFactory 클래스]

public class WhiteShipFactory implements ShipFactory{

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

[WhiteShip 클래스]

public class Whiteship extends Ship{

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

[BlackshipFactory 클래스]

public class BlackshipFactory implements ShipFactory {

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

[Blackship 클래스]

public class Blackship extends Ship{

    public Blackship(){
      setName("blackship");
      setColor("black");
      setLogo("b");
    }
}

[Client 클래스]

public class Client{

    public static void main(String[] args){
        Client client = new Client();
        
        Ship whiteship = new WhiteshipFactory().orderShip("Whiteship", "keesun@gmail.com");
        System.out.println(whiteship);
        
        Ship blackship = new BlackshipFactory().orderShip("Blackship", "keesun@gmail.com");
        System.out.println(blackship);
   }
}

 

참고

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