2021.11.15_팩토리메소드패턴02.패턴적용하기
본문 바로가기
CS Study/디자인패턴

2021.11.15_팩토리메소드패턴02.패턴적용하기

by KyeongMin 2021. 11. 15.
728x90
반응형
  • 아무리 변경해도 코드가 같아야함

Whiteshipfactory.class |before

  public class WhiteshipFactory {
  
      public static Ship orderShip(String name, String email) {
          // validate
          if (name == null || name.isBlank()) {
              throw new IllegalArgumentException("배 이름을 지어주세요.");
          }
          if (email == null || email.isBlank()) {
              throw new IllegalArgumentException("연락처를 남겨주세요.");
          }
  
          prepareFor(name);
  
          Ship ship = new Ship();
          ship.setName(name);
  
          // Customizing for specific name
          if (name.equalsIgnoreCase("whiteship")) {
              ship.setLogo("\uD83D\uDEE5️");
          } else if (name.equalsIgnoreCase("blackship")) {
              ship.setLogo("⚓");
          }
  
          // coloring
          if (name.equalsIgnoreCase("whiteship")) {
              ship.setColor("whiteship");
          } else if (name.equalsIgnoreCase("blackship")) {
              ship.setColor("black");
          }
  
          // notify
          sendEmailTo(email, ship);
  
          return ship;
      }
  
      private static void prepareFor(String name) {
          System.out.println(name + " 만들 준비 중");
      }
  
      private static void sendEmailTo(String email, Ship ship) {
          System.out.println(ship.getName() + " 다 만들었습니다.");
      }
  
  }

ShipFactory.class

public interface ShipFactory{
	default ship orderShip(String name, String email){
		validate(name,email);
    prepareFor(name);
    Ship ship = createShip();
    sendEmailTo(email, ship);
    return 
  }
  
  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("연락처를 남겨주세요.");
        }
  }
  
     private void prepareFor(String name) {
        System.out.println(name + " 만들 준비 중");
    }
}

Whiteship.class

public class Whiteship extends ship{
  public WhiteShip(){
		setName("Whiteship");
    setLogo("\uD83D\uDEE5️");
    setColor("white");
  }
}

WhiteshipFactory.class | after

public class WhiteshipFactory implements ShipFactory{
	@Override
  public Ship createShip(){
    return new Whiteship();
  }
}
  • 화이트 쉽에서 일단은 그냥 인스턴스 생성만 해줌

Client.java | before

public class Client {

    public static void main(String[] args) {
        Ship whiteship = ShipFactory.orderShip("Whiteship", "oksos0817@naver.com");
        System.out.println(whiteship);

        Ship blackship = ShipFactory.orderShip("Blackship", "oksos0817@naver.com");
        System.out.println(blackship);
    }

}

Client.java | after

public class Client {

    public static void main(String[] args) {
       Client client = new Client();
      	Ship whiteship = new WhiteshipFactory().orderShip("Whiteship","oksos@naver.com");
    }

}
  • 이렇게 됬을때 Blackship을 추가할때 소스가 바뀌나 안바뀌나 이것이 포인트
  • 변경에 닫혀있고 확장에 열려있는 구조라면 새로운 배를 만드는 공정을 추가시 기존 코드 변경되면 안됨

Blackship.java

public class Blackship extends Ship{
  	public Blackship(){
		setName("Blackship");
    setLogo("⚓");
    setColor("black");
    }
}

BlackshipFactory.java

public class BlackshipFactory implements ShipFactory{
	@Override
  public  Ship createShip(){
		return new Blackship();
  }
}
  • 이렇게 하면 확장에 열려있고 변경에 닫혀있게됨

Client.java

public class Client {

    public static void main(String[] args) {
       Client client = new Client();
      
      	Ship whiteship = new WhiteshipFactory().orderShip("Whiteship","oksos@naver.com");
        Ship black = new BlackshipFactory().orderShip("Blackship","oksos0817@naver.com");
    }
}
  • 단 클라이언트 코드가 바꼈는데 이게 변경에 닫혀있는것이 맞는지?
    • 구체적 클래스 의존성 주입하는 방식을 쓰면 Client 최대한 고치지 않고 하는 법이 있음
728x90
반응형

댓글