티스토리 뷰

팩토리 메소드 패턴 ( Factory Method Pattern )

💡 다양한 구현체(Product)가 있고, 그 중에서도 특정한 구현체를 만들 수 있는 다양한 팩토리(Creator)를 제공하는 패턴.
상위 타입만 알고도 감춰진 구현체들을 생성할 수 있게 도와주는 Factory를 중간에 두어 새로운 구현체 추가를 위해 기존 코드 수정이 필요 없도록 한다.

 

팩토리 메소드 패턴 컴파일 의존관계

 

새로운 구현체(Product) 확장 후 의존관계

 

 

팩토리 메소드 패턴 런타임 의존관계

 

 

팩토리 메서드 패턴 구현

클래스간 의존 관계도

 

Client
public class Client {
  private final PhoneFactory phoneFactory;

  public Client(PhoneFactory phoneFactory) {
    this.phoneFactory = phoneFactory;
  }

  public void getClientPhone() {
    Phone phone = phoneFactory.orderPhone();
    System.out.println(phone);
  }

}

 

Creator
  • Creator << Interface >>
public interface PhoneFactory {
  default Phone orderPhone(){
    Phone phone = createPhone();
    System.out.println(phone.getName() + "를 주문합니다. ");
    return phone;
  }
  Phone createPhone();
}

 

Concreate Creator
  • 👉 IPhoneFactory 의 경우 아래 Git Repository를 참고하세요
public class GalaxyFactory implements PhoneFactory{
  @Override
  public Phone createPhone() {
    return new GalaxyPhone();
  }
}

 

Product
public class Phone {
  private String name;
  private String os;
  private Long price;

  public Phone() {
  }

  public Phone(String name, String os, Long price) {
    this.name = name;
    this.os = os;
    this.price = price;
  }

  public String getName() {
    return name;
  }

  public String getOs() {
    return os;
  }

  public Long getPrice() {
    return price;
  }

  @Override
  public String toString() {
    return "\\uD83D\\uDCDE{" +
        "name='" + name + '\\'' +
        ", os='" + os + '\\'' +
        ", price=" + price +
        '}';
  }
}

 

 

ConcreateProduct
  • 👉  IPhone 의 경우 아래 Git Repository를 참고하세요
public class GalaxyPhone extends Phone {
  public GalaxyPhone() {
    super("Galaxy", "Android", 1_000_000L);
  }
}

 

Main
public class Main {
  public static void main(String[] args) {
    // Dependency Injection
    Client client1 = new Client(new GalaxyFactory());
    // Dependency Injection
    Client client2 = new Client(new IPhoneFactory());

    client1.getClientPhone();
    client2.getClientPhone();
  }
}

 

결과

 

 

 

런타임 의존관계

 

팩토리 메서드 패턴의 장•단점

장점
  • 팩토리 메서드 패턴을 사용하게 되면 새로운 구현체가 추가되었을 때, 해당 구현체를 확장 하기위해 기존 코드의 변경이 필요하지 않는다는 장점이 존재한다. 즉, OCP ( Open Closed Principle ) 를 지킬 수 있다.
    • Ex) 예제 코드에 구현체 중 IPhone이 추가될 때 의존관계도의 변화는?

 

 

💡OCP ( Open Closed Principle ) 원칙은 객체지향 5원칙 (SOLID) 중 하나로 "확장에는 열려있고 변경에는 닫혀있다" 는 의미를 가진다. 확장에 열려있다는 것은 새로운 코드를 추가하는 것으로 새 기능 추가할 수 있지만 이 과정에서 기존 작성된 코드의 변경은 없어야 한다는 의미이다.
단점
  • 클래스의 수가 늘어나고 그 관계가 복잡 해진다.

 

예제 코드

참조

 

코딩으로 학습하는 GoF의 디자인 패턴 - 인프런 | 강의

디자인 패턴을 알고 있다면 스프링 뿐 아니라 여러 다양한 기술 및 프로그래밍 언어도 보다 쉽게 학습할 수 있습니다. 또한, 보다 유연하고 재사용성이 뛰어난 객체 지향 소프트웨어를 개발할

www.inflearn.com

 

댓글