노트코드
노트코드
노트코드

블로그 메뉴

  • 홈
  • 이력서
  • 이전 블로그
  • 글쓰기
  • 관리자페이지
  • 분류 전체보기 (57)
    • 코틀린 (2)
      • 실무 프로젝트로 배우는 Kotlin & Sprin.. (2)
    • JAVA (1)
      • 디자인패턴 (1)
      • 객체지향 5대원칙 (0)
    • SPRING (32)
      • JPA (11)
      • 스프링시큐리티 (1)
      • 스프링 (8)
      • QueryDsl (1)
      • 스프링배치 (11)
    • AZURE (0)
    • ETC (10)
      • MAVEN (0)
      • GIT (0)
      • ReMind (3)
      • Exception (1)
      • CS (6)
    • 책 (8)
      • 이것이 자바다 (8)

최근 글

최근 댓글

태그

  • JPA
  • 스프링
전체 방문자
오늘
어제
hELLO · Designed By 정상우.
노트코드

노트코드

카테고리 없음

[백기선-코딩으로 학습하는 GOF디자인]3. 추상 팩토리 패턴

2022. 2. 9. 13:53

목적:

client에서 사용하는 코드를 인터페이스로 변경해서 사용하기 위해사용

관련된 인스턴스들을 하나로 모으는 역활을 한다.

BigBirdFactory에서 BigBird와 관련된 모든 인스턴스를 만들고 최종 BigBird인스턴스를 리턴해주는거 같이

추상 팩토리 패턴을 통해 캡슐화의 기능도 함

public interface BirdAbstractFactory {

    Bird createBird();
}

public class BigBirdFactory implements BirdAbstractFactory {

    private String name;
    private String speed;

    public BigBirdFactory(String name, String speed) {
        this.name = name;
        this.speed = speed;
    }

    @Override
    public Bird createBird() {
        return new BigBird(name, speed);
    }
}

public class SmallBirdFactory implements BirdAbstractFactory {

    private String name;
    private String speed;

    public SmallBirdFactory(String name, String speed) {
        this.name = name;
        this.speed = speed;
    }

    @Override
    public Bird createBird() {
        return new SmallBird(name, speed);
    }
}
public class BirdFactory {

    public static Bird getBird(BirdAbstractFactory birdAbstractFactory) {
        return birdAbstractFactory.createBird();
    }
}
public class Client {

    public static void main(String[] args) {
        Bird bigBird = BirdFactory.getBird(new BigBirdFactory("king", "500"));
        Bird smallBird = BirdFactory.getBird(new SmallBirdFactory("queen", "1"));
        System.out.println(bigBird);
        System.out.println(smallBird);
    }
}
  • 강의 코드

      public interface ShipPartsFactory {
    
          Anchor createAnchor();
    
          Wheel createWheel();
    
      }

    위와 같이 인터페이스로 기능을 빼고,

      public class WhitePartsProFactory implements ShipPartsFactory {
          @Override
          public Anchor createAnchor() {
              return new WhiteAnchorPro();
          }
    
          @Override
          public Wheel createWheel() {
              return new WhiteWheelPro();
          }
      }

    위와 같이 해당 인터페이스를 구현한 WhitePartsProFactory를 만들어준다.

      public class WhiteshipFactory extends DefaultShipFactory {
    
          private ShipPartsFactory shipPartsFactory;
    
          public WhiteshipFactory(ShipPartsFactory shipPartsFactory) {
              this.shipPartsFactory = shipPartsFactory;
          }
    
          @Override
          public Ship createShip() {
              Ship ship = new Whiteship();
              ship.setAnchor(shipPartsFactory.createAnchor());
              ship.setWheel(shipPartsFactory.createWheel());
              return ship;
          }
      }

    ShipPartsFactory 를 구현한 클래스가 누구냐에 따라 Anchor와 Wheel은 바뀔수가 있게됨 그러면서 동시에

    ship.setAnchor(shipPartsFactory.createAnchor()); 와 ship.setWheel(shipPartsFactory.createWheel()); 는 소스코드의 변경이 없게 된다.

      public class ShipInventory {
    
          public static void main(String[] args) {
              ShipFactory shipFactory = new WhiteshipFactory(new WhiteshipPartsFactory());
              Ship ship = shipFactory.createShip();
              System.out.println(ship.getAnchor().getClass());
              System.out.println(ship.getWheel().getClass());
          }
      }

팩토리 메소드 패턴

  • 인스턴스를 만드는(객체를 만드는) 과정에 좀더 집중 되어있음 ⇒ 추상화되어있음
  • 팩토리를 구현하는 방법에 초점
  • 구체적인 객체 생성 과정을 하위 또는 구체적인 클래스로 옮기는것이 목적

추상 팩토리 패턴

  • 팩토리를 사용하는 방법에 초점
  • 관련이있는 여러 객체를 구체적인 클레스에 의존하지 않고 만들 수 있게 해주는것이목적
    노트코드
    노트코드
    노션 블로그에서 티스토리로 이전공사중

    티스토리툴바