본문 바로가기

강의/Design pattern

팩토리 메소드 (Factory method) 패턴

SMALL

https://velog.io/@sillutt/%ED%8C%A9%ED%86%A0%EB%A6%AC-%EB%A9%94%EC%86%8C%EB%93%9C-Factory-method-%ED%8C%A8%ED%84%B4

 

팩토리 메소드 (Factory method) 패턴

어떤 객체 및 인스턴스를 생성하는 책임을 추상적인 인터페이스의 메소드로 감싸는 패턴이다.

velog.io

 

팩토리 메소드 (Factory method) 패턴?


어떤 객체 및 인스턴스를 생성하는 책임을 추상적인 인터페이스의 메소드로 감싸는 패턴이다. 구체화한 클래스에 모든 코드를 넣는 작업은 복잡하기 때문에 팩토리 패턴을 사용한다.
팩토리 역할을 할 인터페이스를 만들고 메소드들을 정의한다. 이 중 일부를 하위 클래스에서 구체적인 인스턴스를 만들게 된다. 이후 팩토리에서 만든 오브젝트의 타입 또한 인터페이스를 만들고 각각의 구체적인 인스턴스를 만들도록 설계하면 확장에 용이한 코드를 만들 수 있다.

public interface ShipFactory {
default Ship orderShip(String name, String email) {
     validate(name, email);
        Ship ship = createShip();
        sendEmailTo(email, ship);
        return ship;
    }
    private static void sendEamilTo(String email, Ship ship)  {
     // print
   } 
    //default로 정의하지 않았기 때문에 반드시 하위클래스에서 정의해야함
    Ship createShip();
    private void validate(String name, String email) {
     // validation
    }
    private void prepare(String name) {
     // check
    }
    
}



이 과정 중 실제 동작이 들어가는 부분은 orderShip 뿐이다. 이렇게 메소드를 추상화해서 따로 관리하면 내부 로직이 훨씬 간결해지고 읽기 쉬워진다. 



인터페이스 적용하기

메소드 안에서는 인터페이스 코딩이기 때문에 실행하는 코드는 변하지 않는다. 넘겨주는 부분에서만 객체를 선택하면 된다. 일종의 DI로 생각할 수 있다. (메소드 파라미터를 사용해서 의존성 주입이 진행됨)
위의 방법은 Java 9 부터 지원하며, 아래 버전에서는 중간 계층에 추상 클래스를 만들어 메소드 정의와 구현체를 만들면 된다. 그리고 실제 클래스에서는 여기서 생성한 추상 클래스를 상속받아 사용할 수 있다.


정리


> Q. 팩토리 메소드 패턴을 적용했을 때의 장단점
A. 확장에 열려있고 변경에 닫혀있어 기존 코드를 건드리지 않고 새로운 인스턴스를 다른 방법으로 확장할 수 있지만(losely create), 각자의 역할을 나누기 때문에 파일이 여러개 생성된다. 

> Q. 확장에 열려있고 변경에 닫혀있는 객체 지향 원칙(OCP)?
클래스에 대해 틀은 유지하면서 속성 값을 변경되는 방법이다.

> Q. 자바 8에 추가된 default 메소드란?
인터페이스에는 추상메소드만 정의하고 구현 클래스에서 구현하는 방식을 사용했지만, default로 기본 구현체를 만들 수 있고 이를 상속받는 다른 인터페이스를 구현하도록 적용하고 있다. 그래서 Java 8 이상부터는 추상 클래스를 많이 사용하지 않고 인터페이스에서 구현하도록 진행한다.


자바와 스프링의 패턴

- 단순한 팩토리 패턴
매개변수의 값에 따라 또는 메소드에 따라 각기 다른 인스턴스를 리턴하는 단순한 버전의 팩토리 패턴
ex) java.lang.Calendar, java.lang.NumberFormat

- 스프링 BeanFactory
Object 타입의 Product를 만드는 BeanFactory


SMALL

'강의 > Design pattern' 카테고리의 다른 글

프로토타입 (Prototype) 패턴  (0) 2022.08.16
빌더 (Builder) 패턴  (0) 2022.08.16
추상 팩토리 (Abstract factory) 패턴  (0) 2022.08.16
싱글톤(Singleton) 패턴  (0) 2022.08.16
[Java] Volatile  (0) 2022.08.16