본문 바로가기
실생활정보

객체지향 디자인 패턴 - 팩토리 메서드 패턴에 관한 모든 것

by rainypass 2024. 3. 11.

1. 팩토리 메서드 패턴 소개

 

1.-팩토리-메서드-패턴-소개

 

 

팩토리 메서드 패턴은 객체지향 디자인 패턴 중 하나로, 객체를 생성하는 인터페이스는 둔 채로 서브클래스에서 인스턴스화할 클래스를 결정하는 패턴이다. 이를 통해 코드의 유연성을 높이고 객체 생성 과정을 쉽게 확장할 수 있다. 팩토리 메서드 패턴은 구체적인 생성 로직을 서브클래스로 분리하여 부모 클래스와 서브클래스 간의 의존성을 낮춘다. 따라서 코드의 유지보수성과 확장성이 향상되며, 객체 생성 과정에 대한 변화가 있을 때 수정이 용이하다. 생성 코드를 중앙 집중화하여 일관성 있는 객체 생성을 도와주며, 객체의 타입을 명확히 표현할 수 있다. 팩토리 메서드 패턴은 객체지향 소프트웨어 설계에 있어 유용하고 효율적인 방법 중 하나이다.

 

 

 

2. 팩토리 메서드 패턴의 구조

 

2.-팩토리-메서드-패턴의-구조

 

 

### 2. 팩토리 메서드 패턴의 구조

 

팩토리 메서드 패턴은 객체지향 디자인 패턴 중 하나로, 상위 클래스에서 인터페이스를 정의하고 하위 클래스에서 이를 구현하여 객체 생성을 캡슐화하는 패턴이다. 이 패턴은 다음과 같은 구조로 이루어져 있다.

 

1. **Product (생산물) 클래스**

 

- 팩토리 메서드 패턴이 생성할 객체의 공통 인터페이스를 정의한다.

 

- ConcreteProduct 클래스가 구현하는 인터페이스를 포함한다.

 

2. **ConcreteProduct (구체적인 생산물) 클래스**

 

- Product 클래스에서 정의한 인터페이스를 구현하여 실제 객체를 생성하는 클래스이다.

 

- 여러 개의 ConcreteProduct 클래스가 존재할 수 있다.

 

3. **Creator (생산자) 클래스**

 

- Product 객체를 생성하는 팩토리 메서드를 선언하는 추상 클래스이다.

 

- 팩토리 메서드는 객체를 생성하는데 사용되는 인터페이스를 정의한다.

 

4. **ConcreteCreator (구체적인 생산자) 클래스**

 

- Creator 클래스에서 선언된 팩토리 메서드를 구현하여 실제 객체를 생성하는 클래스이다.

 

- 특정 ConcreteProduct 객체를 생성하는 책임을 갖는다.

 

이러한 구조를 통해, 팩토리 메서드 패턴은 객체 생성 과정을 일반화하고 확장성을 갖게 함으로써 코드의 유연성과 유지보수성을 향상시킨다.subclass에서 팩토리 메서드를 재정의하여 새로운 객체 생성 방식을 추가할 수 있기 때문에 이 패턴은 변하는 요구사항에 쉽게 대응할 수 있는 장점을 갖고 있다.

 

 

 

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

 

3.-팩토리-메서드-패턴의-장단점

 

 

팩토리 메서드 패턴의 장점은 객체를 생성하는 과정과 사용하는 과정을 분리할 수 있다는 것이다. 이를 통해 코드의 유연성과 확장성이 증가하며, 새로운 객체를 추가하거나 변경하기 쉬워진다. 또한, 코드 중복을 최소화하고 콘크리트 클래스와 추상 클래스 사이의 의존성을 줄일 수 있는 장점이 있다.

 

반면에 팩토리 메서드 패턴의 단점으로는 클래스의 수가 증가하고 복잡성이 증가할 수 있다는 점이 있다. 또한, 팩토리 메서드 패턴을 사용하기 위해서는 인터페이스나 추상 클래스를 추가로 생성해야하는 번거로움이 발생할 수 있다. 이로 인해 프로젝트의 규모나 복잡성에 따라 적합한 디자인 패턴을 선택해야 한다.

 

 

 

4. 팩토리 메서드 패턴의 활용 예시

 

4.-팩토리-메서드-패턴의-활용

 

 

서비스 프로바이더 인터페이스를 구현하는 여러 이메일 서비스 클래스를 가정해보겠습니다. 첫 번째 클래스는 Gmail을 이용하는 EmailSender와 이와 유사한 Microsoft Outlook을 이용하는 EmailSender2 클래스가 있습니다. 팩토리 메서드 패턴을 적용하여 두 이메일 서비스에 대한 객체 생성을 추상화하여 이용해봅시다.

 

```java

 

// 이메일을 보내는 서비스 프로바이더 인터페이스

 

interface EmailProvider {

 

void sendEmail(String recipient, String content);

 

}

 

// Gmail을 이용하는 EmailSender

 

class GmailSender implements EmailProvider {

 

@Override

 

public void sendEmail(String recipient, String content) {

 

// Gmail을 이용하여 이메일을 보내는 기능 구현

 

}

 

}

 

// Microsoft Outlook을 이용하는 EmailSender2

 

class OutlookSender implements EmailProvider {

 

@Override

 

public void sendEmail(String recipient, String content) {

 

// Outlook을 이용하여 이메일을 보내는 기능 구현

 

}

 

}

 

// 팩토리 메서드 패턴을 이용한 이메일 서비스 객체 생성

 

class EmailServiceProviderFactory {

 

EmailProvider createEmailProvider(String providerType) {

 

if ("Gmail".equals(providerType)) {

 

return new GmailSender();

 

} else if ("Outlook".equals(providerType)) {

 

return new OutlookSender();

 

}

 

return null;

 

}

 

}

 

// 팩토리 메서드 패턴 활용 예시

 

public class FactoryMethodPatternExample {

 

public static void main(String[] args) {

 

EmailServiceProviderFactory factory = new EmailServiceProviderFactory();

 

EmailProvider emailService = factory.createEmailProvider("Gmail");

 

emailService.sendEmail("example@example.com", "Factory Method Pattern Example");

 

}

 

}

 

```

 

이와 같이 팩토리 메서드 패턴을 활용하면 새로운 이메일 서비스 클래스가 추가되어도 쉽게 확장이 가능하며, 클라이언트는 구체적인 이메일 서비스 클래스를 알 필요 없이 공통된 인터페이스를 통해 이용할 수 있습니다. 팩토리 메서드 패턴은 객체 생성에 대한 결정을 서브클래스에게 위임함으로써 유연성을 제공합니다.

 

 

 

5. 팩토리 메서드 패턴과 추상 팩토리 패턴의 비교

 

5.-팩토리-메서드-패턴과-추상

 

 

팩토리 메서드 패턴과 추상 팩토리 패턴은 둘 다 객체 생성에 관한 디자인 패턴이지만, 다음과 같은 차이점이 존재한다.

 

1. 목적:

 

- 팩토리 메서드 패턴: 객체 생성을 서브 클래스에서 결정하도록 만들어주는 패턴.

 

- 추상 팩토리 패턴: 관련성 있는 여러 개의 객체를 생성하기 위한 인터페이스를 제공하는 패턴.

 

2. 확장성:

 

- 팩토리 메서드 패턴: 객체 생성을 처리하는 메서드를 하나만 가지고 있어 단일 개체 생성에 사용됨.

 

- 추상 팩토리 패턴: 여러 개의 관련된 객체 생성을 처리하는 메서드들을 제공해 구체적인 팩토리를 통해 다양한 객체를 생성할 수 있음.

 

3. 활용 방식:

 

- 팩토리 메서드 패턴: 객체 생성 로직을 하위 클래스에 위임하여 구체 클래스 별로 다른 객체를 생성할 수 있게 함.

 

- 추상 팩토리 패턴: 인터페이스를 통해 서로 관련된 객체군을 생성하여 이 객체군을 변경하지 않고도 새로운 객체군을 도입할 수 있게 함.

 

이렇게 팩토리 메서드 패턴과 추상 팩토리 패턴은 객체 생성의 유연성과 확장성을 제공하는 데 각각의 특징을 가지고 있으며, 상황에 맞게 적절히 선택하여 사용해야 한다.

 

 

 

6. 결론

 

6.-결론

 

 

팩토리 메서드 패턴은 객체지향 소프트웨어 디자인에서 중요한 역할을 하는 디자인 패턴 중 하나로, 객체 생성을 서브클래스로 미루어 유연성과 확장성을 확보할 수 있다. 이 패턴을 통해 클라이언트 코드는 구체적인 클래스를 알 필요 없이 객체를 생성할 수 있는 이점을 얻게 된다. 또한, 객체 생성과 사용을 분리함으로써 코드의 수정을 최소화하고 코드의 재사용성을 높일 수 있다. 팩토리 메서드 패턴은 어떠한 상황에서도 유용하게 활용될 수 있으며, 유연하고 확장 가능한 소프트웨어 디자인을 위한 필수적인 도구로 활용될 수 있다. 따라서, 객체지향 소프트웨어 개발을 위해 팩토리 메서드 패턴을 적극적으로 활용해보는 것을 권장한다.