Factory Method 팩토리 메서드

고승원·2022년 10월 18일
0

Design Pattern

목록 보기
1/5

부모 클래스에서 객체를 생성하기 위한 인터페이스를 제공하지만, 자식 클래스가 생성될 객체의 유형을 결정할 수 있도록 한다.

사용처

  • 코드에서 작업하는 객체의 정확한 유형과 종속성을 미리 알 수 없는 경우

  • 라이브러리 또는 프레임워크의 사용자에게 내부 구성요소를 확장하는방법을 제공하는 경우

  • 기존 객체를 재사용하는 경우

    장단점

  • SRP를 지킨다

  • OCP를 지킨다

  • creator와 product간의 결합도를 낮춰준다


  • 코드가 복잡해진다.

    구현

    Product : 작성자와 해당 하위 클래스가 생성할 수 있는 모든 객체에 대한 공통 인터페이스

    ConcreateProduct : Product interface의 구현체

    Creator : 새로운 객체를 반환하는 팩토리 메서드를 선언한다. 이 메서드의 return은 Product interface와 일치해야 한다.

    ConcreateCreator : 기본 팩토리 메서드를 override하여 다른 Product를 반환한다. (항상 새로운 인스턴스를 반환할 필요는 없다.)

    1. 모든 클래스(제품)가 동일한 인터페이스를 implements하게 만든다. 인터페이스는 모든 클래스(제품)에서 의미있는 메서드를 선언해야 한다.

    2. 생성자 클래스 내부에 비어있는 메서드를 추가한다. 리턴타입은 공통 인터페이스와 동일해야 한다.

    3. creator 코드에서 모든 생성자 클래스(제품)를 찾는다. 제품 생성 코드를 모두 팩토리 메서드로 변경한다.

    4. 팩토리 메서드에 나열된 각 클래스 유형에 대한 자식 클래스를 작성한다. 자식 클래스에서 팩토리 메서드를 override하고, 기본 메서드에서 적절한 구성 코드 비트를 추출한다.

      말로는 이해가 잘 안된다. 코드를 보고 이해하자

      Product

      interface Phone {
      	void ap;
      	void ram;
      }

      ConcreateProduct

      class SamsungGalaxyS implements Phone {...}
      
      class SamsungGalaxyNote implements Phone {...}

      Creator

      abstract class PhoneStore {
      	public Phone orderPhone(String type) {
      		Phone phone = makePhone(type); 
      		phone.ap();
      		phone.ram();
      		return phone;
      	}
      
      	//factory method
      	abstract Phone makePhone(String type);
      }

      ConcreateCreator

      class SamsungPhoneStore extends PhoneStore{
      	@Override
      	Phone makePhone(String type) {
      		if("galaxyS".equals(type)) {
      			return new SamsungGalaxyS();
      		}else if ("galaxyNote".equals(type) {
      			return new SamsungGalaxyNote();
      		} 
      		return null;
      	}
      }
      
      class ApplePhoneStore extends PhoneStore{
      	@Override
      	Phone makePhone(String type) {
      		if("pro".equals(type)) {
      			return new AppleIphonePro();
      		}else if ("mini".equals(type) {
      			return new AppleIphoneMini();
      		} 
      		return null;
      	}
      }
      
      PhoneStore samsungStore = new SansungPhoneStore();
      PhoneStore appleStore = new ApplePhoneStore();
      
      Phone sPhone = samsungStore.makePhone("galaxyS");
      Phone miniPhone = appleStore.makePhone("mini");

      factory method부터 시작하여 abstract factory, prototype 또는 builder패턴으로 발전한다.

profile
봄은 영어로 스프링

0개의 댓글