디자인 패턴 (Design Pattern)

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

종우공간 2021. 6. 22. 08:52

종류: 생성패턴 (Creation Pattern)

 

목적: 조건에 따라 객체를 다르게 생성해야 하는 경우에 사용한다.

 

특징: new 연산자를 직접 사용하지 않고 팩토리 클레스에 위임하여 객체를 생성하도록 한다.

 

(자료 1)

https://victorydntmd.tistory.com/299

 

[디자인패턴] 팩토리 메서드 패턴 ( Factory Method Pattern )

팩토리 메서드 패턴 ( Factory Method Pattern ) 어떤 상황에서 조건에 따라 객체를 다르게 생성해야 할 때가 있습니다. 예를 들면, 사용자의 입력값에 따라 하는 일이 달라질 경우, 분기를 통해 특정 객

victorydntmd.tistory.com

어떤 상황에서 조건에 따라 객체를 다르게 생성해야 할 때가 있다.

예를 들면, 사용자의 입력 값에 따라 하는 일이 달라질 경우, 분기를 통해 특정 객체를 생성해야 한다.

객체마다 하는 일이 다르기 때문에 조건문에 따라 객체를 다르게 생성하는 것은 이상한 일이 아니다.

 

팩토리 메서드 패턴은 이렇게 분기에 따른 객체의 생성(new 연산자로 객체를 생성하는 부분)을 직접 하지 않고, 팩토리라는 클레스에 위임하여 팩토리 클래스가 객체를 생성하도록 하는 방식을 말한다.

팩토리는 말 그대로 객체를 찍어내는 공장을 의미한다.

 

문제점: 분기처리하여 객체를 생성하는 코드가 여러 클래스에서 사용된다면 중복 된 코드가 발생한다. 또한 객체를 생성하는 일은 객체간의 결합도를 강하게 만드는 일이고, 객체 간 결합도가 강하면 유지보수가 어려워진다. 따라서 팩토리 메서드 패턴을 사용하여, 다른 객체 생성하는 부분을 자신(필요한 클래스)이 하지 않고 팩토리 클래스를 만들어서 위임한다.

 

(자료 2)

https://johngrib.github.io/wiki/factory-method-pattern/

 

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

객체를 생성하기 위한 인터페이스를 정의하고, 인스턴스 생성은 서브클래스가 결정하게 한다

johngrib.github.io

의도: 객체를 생성하기 위해 인터페이스를 제공하지만, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브클래스가 내리도록 한다.

 

요약: 객체 생성을 캡슐화하는 패턴이다.

 

(자료 3)

https://niceman.tistory.com/143

 

Java(자바) 디자인패턴 - 팩토리(Factory Method) 패턴 설명 및 예제소스

Java 디자인패턴 - 팩토리 메소드 패턴 이번 시간에는 자바 디자인 패턴 중 팩토리 메소드 패턴(Factory Method Pattern)에 대해서 쉬운 예제와 함께 설명 드리려 합니다. 팩토리 메소드 패턴은 요약

niceman.tistory.com

팩토리 메소드 패턴은 요약해서 말하자면 객체 생성을 대신 수행해주는 공장이다. 간접적으로 객체 생성 후 반환해주는 방식이다.

 

팩토리 클래스만 관리하면 되므로 객체 생성에 관한 확장도 쉽게 구성할 수 있다.

 

장단점

- 생성 할 클래스를 미리 알지 못해도 팩토리 클래스가 객채 생성 담당

- 객체의 자료형이 하위클래스에 의해서 결정 -> 확장 용이성

- 동일한 형태로 프로그래밍 가능

- 확장성 있는 전체 프로젝트 구성 가능

- 객체가 늘어날 때 마다 하위클래스 재 정의로 인한 불필요한 많은 클래스 생성 가능성

 

(내 생각)

abstract 클래스에 있는 메소드 중 객체를 생성하는 메소드를 서브클래스에서 redefine 하는 경우에 그 메소드를 팩토리 메소드 라고 부른다. 왜냐하면 그 메소드는 객체를 생성하는 역할을 맡기 때문이다.

 

간단히 말하면, 팩토리 클래스를 하나 만들어서 조건에 따라 객체를 생성하는 일을 위임하는 것이다. 그리고 그 객체들이 필요한 클래스에서 팩토리 클래스의 (팩토리) 메소드를 이용하여 객체를 만든다. 이렇게 할 경우 new 연산자를 사용하지 않아도 되어서 객체간의 결합도가 낮아지고 유지보수가 용이해진다.

 

조건에 따라 다른 객체를 생성하는 느낌이기에 같은 범주에 있는(인터페이스나 abstract으로 묶을 수 있는)객체들이 있는 경우에 사용한다. 같은 범주에 있는 클래스들 이기에 확장 가능성을 고려하는 것 이다.