팩토리 패턴, 템플릿 메소드 패턴
팩토리 패턴
- 모든 팩토리 패턴에서는 객체 생성을 캡슐화한다.
- 팩토리 패턴에는 팩토리 메소드 패턴과 추상 팩토리 패턴이 존재한다.
- 팩토리 메소드 패턴 객체를 생성하기 위한 인터페이스를 정의하는데, 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정한다.
- 추상 팩토리 패턴 인터페이스를 이용하여 서로 연관된, 또는 의존하는 객체를 구상 클래스를 지정하지 않고도 생성할 수 있다. 추상 팩토리 패턴에는 팩토리 메소드 패턴이 포함될 수 있다.
- 디자인 원칙 중 ‘추상화된 것에 의존하도록 만들어라. 구상 클래스에 의존하지 않도록 만든다’에 기인한 패턴이다.
팩토리 패턴의 핵심은 ‘클래스의 인스턴스를 만드는 것을 서브(자식) 클래스에서 결정하도록 한다‘는 것이다. 즉, new키워드를 사용하는 부분을 서브클래스에 위임함으로서 객체 생성을 캡슐화하고 구상 클래스에 대한 의존성이 줄어든다는 이점을 얻을 수 있다.
특히 구상 클래스에 대한 의존성이 줄어드는 것은 의존성 뒤집기(Dependency Inversion Principle : DI)에 기인한다.
구체 클래스를 생성하는 패턴이며. 자식(하위) 클래스가 어떤 객체를 생성할지를 결정하도록 하는 패턴이기도 하다. 부모(상위) 클래스 코드에 구체 클래스 이름을 감추기 위한 방법으로도 사용한다.
템플릿 메소드 패턴
슈퍼클래스에 기본적인 로직의 흐름(변하지 않는 기능)을 만들고, 그 기능의 일부를 추상 메소드나 오버라이딩이 가능한 protected 메소드(변하는 기능) 등으로 만든 뒤 서브클래스에서 이런 메소드를 필요에 맞게 구현해서 사용하는 방법을 템플릿 메소드 패턴이라고 한다.
변하는 기능을 갖는 메소드로 선택적으로 오버라이드 가능한 훅 메소드, 반드시 구현해야할 추상 메소드 등이 잇다.(void 가능)
팩토리 메소드 패턴
템플릿 메소드 패턴과 비슷하게 상속을 통해 기능을 확장하는 패턴이다. 슈퍼클래스 코드에서는 서브클래스에서 구현할 메소드를 호출해서 필요한 타입의 오브젝트를 가져와 사용한다. 이 메소드는 주로 인터페이스 타입으로 오브젝트를 리턴하므로 서브클래스에서 정확히 어떤 클래스의 오브젝트를 만들어 리턴할지는 슈퍼클래스에서 알지 못한다.
서브클래스에서는 다양한 방법으로 오브젝트를 생성하는 메소드를 정의할 수 있다. 이렇게 서브클래스에서 오브젝트 생성 방법과 클래스를 결정할 수 있도록 미리 정의해둔 메소드를 팩토리 메소드라 한다.
객체를 생성하기 위한 인터페이스를 정의하는데, 어떤 클래스의 인스턴스를 만들지는 서브 클래스에서 결정하도록 하는 것이다. 팩토리 메소드 패턴은 팩토리 메소드는 객체를 생성해 반환하는 것을 말한다. 즉, 결과값이 객체인 것이다.
특징
클래스의 변경사항이 생겼을 때 얼마나 다른 클래스에게도 영향을 줄 것인가가 결합도이다. 팩토리 메소드 패턴은 직접 사용하는 객체를 생성하지 않고 팩토리 메소드 클래스를 통해 객체를 대신 생성하고 그 객체를 반환 받아 사용하기 때문에 효율적인 코드 제어를 할 수 있을 뿐만 아니라 결합도를 낮춰 유지보수가 용이하다.
문제점
- 다중 상속을 허용하지 못하는 자바 특성이 있어 단지 기능 분리를 위해 상속을 사용하는 것은 비효율적 (상속을 사용하지만 부모(상위) 클래스를 전혀 확장하지 않는다. 따라서 이 패턴은 extends 관계를 잘못 이용한 것으로 볼 수 있다. extends 관계를 남발하게 되면 프로그램의 엔트로피(Information entropy)가 높아질 수 있으므로 Factory Method 패턴의 사용을 주의해야 한다)
- 상하위 관계는 생각보다 밀접하여 슈퍼클래스의 변화가 있으면 모든 서브 클래스를 함께 수정하거나 다시 개발할 수도 있다.
- 로직마다 상속을 통해 새로운 클래스를 만들어야 한다.
- 확장 구조가 이미 클래스를 설계하는 시점에서 고정되어 버린다.
팩토리 메소드 패턴? 템플릿 메소드 패턴?
Factory Method 패턴은 기반 클래스에 알려지지 않은 구체 클래스를 생성하는 Template Method라 할 수 있다. Factory Method의 반환 타입은 생성되어 반환되는 객체가 구현하고 있는 인터페이스이다. Factory Method는 또한 기반 클래스 코드에 구체 클래스의 이름을 감추는 방법이기도 하다(Factory Method는 부적절한 이름이다. 사람들은 객체를 생성하는 모든 메소드를 자연스레 팩토리 메소드라 부르는 경향이 있는데, 이러한 생성 메소드가 모두 Factory Method 패턴을 사용하는 것은 아니다(실용주의 디자인 패턴))
추상 팩토리 패턴
인터페이스를 이용하여 서로 연관된, 또는 의존하는 객체를 구상 클래스를 지정하지 않고도 생성할 수 있다고 했다. 즉, 연관된 서브 클래스를 그룹화할 수 있고 이것은 이 그룹을 자유롭게 교체할 수 있는 패턴
출처
토비의 스프링(책)
댓글남기기