2021.11.18_팩토리메소드패턴03.인터페이스적용하기
본문 바로가기
CS Study/디자인패턴

2021.11.18_팩토리메소드패턴03.인터페이스적용하기

by KyeongMin 2021. 11. 18.
728x90
반응형

2021.11.18_03.인터페이스적용하기

Client.class

public class Client {

    public static void main(String[] args) {
       Client client = new Client();
      
      	Ship whiteship = new WhiteshipFactory().orderShip("Whiteship","oksos@naver.com");
        System.out.println(whiteship);
        Ship black = new BlackshipFactory().orderShip("Blackship","oksos0817@naver.com");
        System.out.println(blackship);
    }
}
  • 이전에 소스는 Client부분이 수정이되었다.

Client.class

public class Client {

    public static void main(String[] args) {
       Client client = new Client();
      	client.print(new WhiteshipFactory(),"whiteship","oksos0817@naver.com");
        client.print(new BlackshipFactory(),"blackship","oksos0817@naver.com");
    }
    private void print (ShipFactory shipFactory, String name, String email){
        System.out.println(shipFactory.orderShip(name,email));
    }
}
  • 인터페이스 기반으로 되어있다면 저런식으로 하면 코드가 변경없이 하지만 어떤것인지는 알아야하지만 변경이 덜된다.
  • 클라이언트 변경의 최소화 한것

java9, 11의 경우

	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() + " 다 만들었습니다.");
  }
  • 8은 안되고 9 이상 부터 private 메소드를 만들 수 있는 것
  • 그렇지 않으면 아래와 같다.

DefaultShipFactory.class

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

ShipFactory.class

  private void sendEmailTo(String email, Ship ship) {
        System.out.println(ship.getName() + " 다 만들었습니다.");
  }
// 이것을 추상메소드로 우선 정의
void sendEmailTo(String email, Ship ship);
  • 자바 8의 경우 계층 구조로 만들어서 저렇게 하면되고
  • DefaultShipFactory를 상속해주면됨
  • 계층구조가 있어서 팩토리 안에서 구체적인 클래스를 만들어냄
    • 구체적인 제품을 만들어내는것이 포인트
728x90
반응형

댓글