디자인 패턴

[디자인패턴] 팩토리(Factory)패턴

뇌장하드 2022. 4. 8. 10:11
  • 팩토리 메서드란
    • 팩토리 메소드 패턴을 이용하면 클래스의 인스턴스를 만드는 일을 서브클래스에게 맡길수 있다.
    • 자주 변화가 있는 부분을 밖으로 빼낸다.
  • 팩토리메서드의 장점
    • 기존의 인스턴스를 만든는 코드를 변경하지 않고 같은 류의 새로운 인스턴스를 생성 또는 확장이 가능하다.(OOP의 5대원칙중 하나인 개방 폐쇄 원칙 (Open-Closed Principle, OCP)를 만족하게 한다.)
    • 느슨한 결합을 만들수 있다.
  • 팩토리 메서드의 단점
    • 역할분담을 위해서 클래스가 많아진다.

기존의 코드

  • 기존의 팩토리 코드

      public class ShipFactory {
    
          //새로운 기능을 넣을려면 코드가 고쳐져야한다. 변경에 닫혀져있는 객체지향의 원치 위반 만들어지는 과정이 이리저리 산만해서 코드 가독성이 떨어진다.
          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() + " 다 만들었습니다.");
          }
    
      }

    팩토리 메서드 적용후

    • 생성자를 제외한 빼고 나머지를 인터페이스로 빼버린다.

        **public interface ShipFactory {
            default Ship orderShip(String name, String email){
                validate(name,email);
                prepareFor(name);
                Ship ship=createShip();
                sendEmailTo(email, ship);
                return ship;
            }
      
            Ship createShip();
            private  void sendEmailTo(String email, Ship ship) {
                System.out.println(ship.getName() + " 다 만들었습니다.");
            }
      
            private void validate(String name,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 + " 만들 준비 중");
            }
        }**
      • Ship createShip()을 구현체에서 구현을 해준다.

      • 기능을 확장을 할때에 기존코드를 안건들이고 확장이 가능하다.

스크린샷_2022-04-07_오후_5 33 48 스크린샷_2022-04-07_오후_5 46 47

전체 소스코드

'디자인 패턴' 카테고리의 다른 글

[디자인패턴] 싱글톤(Singleton) 패턴  (0) 2022.04.10
[디자인패턴] 빌더(Builder)패턴  (0) 2022.04.08
커맨드 패턴  (0) 2021.12.21