개발 무지렁이

[Java] 디자인패턴 中 생성패턴, 팩토리 메서드(Factory method) 패턴 본문

Backend/자바

[Java] 디자인패턴 中 생성패턴, 팩토리 메서드(Factory method) 패턴

Gaejirang-e 2022. 11. 28. 15:39

📌. 디자인 패턴
: 소프트웨어 개발에서 자주 발생하는 문제를 해결하기 위한 설계상의 문제해결방법을 말한다.
: 개발자 사이에서 공유되고, 사용되는 검증된 솔루션이다.
🧩일관성, 🧩유지보수성, 🧩재사용성을 높인다.

       🥥. 생성패턴 in 디자인패턴
       :객체 생성과정을 유연하게 다룰 수 있다

배급받는 팩토리 패턴


🍕. 레시피를 가지고 있는 공장에서 배급받는 구조

  class 오리 {
    private String 종류;
    private 비행아이템 a비행아이템;
    private 헤엄아이템 a헤엄아이템;

    public 오리(String 종류) {
        this.종류 = 종류;
    }

    public void 날다() {
        a비행아이템.작동();
    }

    public void 헤엄치다() {
        a헤엄아이템.작동();
    }

    public void set비행아이템(비행아이템 a비행아이템) {
        this.a비행아이템 = a비행아이템;
    }

    public void set헤엄아이템(헤엄아이템 a헤엄아이템) {
        this.a헤엄아이템 = a헤엄아이템;
    }
  }

  interface 아이템 {
      void 작동();
  }

  interface 비행아이템 extends 아이템 {}

  class 날개비행아이템 implements 비행아이템 {
      @Override
      public void 작동() {
          System.out.println("날개로 날아갑니다.");
      }
  }

  class 못나는비행아이템 implements 비행아이템 {
      @Override
      public void 작동() {
          System.out.println("날지 못합니다.");
      }
  }

  class 로켓파워비행아이템 implements 비행아이템 {
      @Override
      public void 작동() {
          System.out.println("로켓파워로 날아갑니다.");
      }
  }

  interface 헤엄아이템 extends 아이템 {}

  class 물갈퀴헤엄아이템 implements 헤엄아이템 {
      @Override
      public void 작동() {
          System.out.println("물갈퀴로 헤엄칩니다.");
      }
  }

  class 둥둥헤엄아이템 implements 헤엄아이템 {
      @Override
      public void 작동() {
          System.out.println("둥둥 떠다닙니다.");
      }
  }

  class 로켓파워헤엄아이템 implements 헤엄아이템 {
      @Override
      public void 작동() {
          System.out.println("로켓파워로 헤엄칩니다.");
      }
  }

  class 오리공장 {
      public static 오리 get(String 종류) {
          오리 a오리 = new 오리(종류);
          switch(종류) {
              case "청둥":
              case "흰":
                  a오리.set비행아이템(new 날개비행아이템());
                  a오리.set헤엄아이템(new 물갈퀴헤엄아이템());
                  break;
              case "천연고무":
              case "합성고무":
                  a오리.set비행아이템(new 못나는비행아이템());
                  a오리.set헤엄아이템(new 둥둥헤엄아이템());
                  break;
              case "로봇":
                  a오리.set비행아이템(new 로켓파워비행아이템());
                  a오리.set헤엄아이템(new 로켓파워헤엄아이템());
                  break;
          }
          return a오리;
      }
  }

  class Main {
      public static void main(String[] args) {
          오리 a청둥오리 = 오리공장.get("청둥");
          오리 a흰오리 = 오리공장.get("흰");
          오리 a천연고무오리 = 오리공장.get("천연고무");
          오리 a합성고무오리 = 오리공장.get("합성고무");
          오리 a로봇오리 = 오리공장.get("로봇");

          System.out.println("== 청둥오리 ==");
          a청둥오리.날다(); // 날개로 날아갑니다.
          a청둥오리.헤엄치다(); // 물갈퀴로 헤엄칩니다.

          System.out.println("== 흰오리 ==");
          a흰오리.날다(); // 날개로 날아갑니다.
          a흰오리.헤엄치다(); // 물갈퀴로 헤엄칩니다.

          System.out.println("== 천연고무오리 ==");
          a천연고무오리.날다(); // 날지 못합니다.
          a천연고무오리.헤엄치다(); // 둥둥 떠다닙니다.

          System.out.println("== 합성고무오리 ==");
          a합성고무오리.날다(); // 날지 못합니다.
          a합성고무오리.헤엄치다(); // 둥둥 떠다닙니다.

          System.out.println("== 로봇오리 ==");
          a로봇오리.날다(); // 로켓파워로 날아갑니다.
          a로봇오리.헤엄치다(); // 로켓파워오 헤엄칩니다.

          System.out.println("== 합성고무오리 로켓파워 장착 ==");
          a합성고무오리.set비행아이템(new 로켓파워비행아이템());
          a합성고무오리.set헤엄아이템(new 로켓파워헤엄아이템());
          a합성고무오리.날다(); // 로켓파워로 날아갑니다.
          a합성고무오리.헤엄치다(); // 로켓파워로 헤엄칩니다.
      }
  }
Comments