CS 스터디 14주차
팩토리 메서드 패턴
팩토리 메서드 패턴(Factory Method Pattern)
팩토리 메서드 패턴(Factory Method Pattern)은 객체지향 디자인 패턴 중 하나로,
객체 생성의 책임을 팩토리 메서드로 추상화하여 객체 생성의 유연성을 제공하는 패턴이다.
객체 생성 코드를 클라이언트 코드에서 분리하여 객체 생성 과정에서 발생할 수 있는 변경에 쉽게 대처할 수 있도록 해준다.
객체를 생성하기 위한 인터페이스를 정의하고 실제 객체 생성은 서브클래스에서 담당하게 하는 패턴으로
클라이언트 코드와 객체 생성 코드를 분리하고 객체 생성 방식을 변경해도 클라이언트 코드에 영향을 미치지 않게 한다.
팩토리 메서드 패턴의 사용방법
1. 추상 클래스(인터페이스)정의
생성될 객체들의 공통 인터페이스 또는 추상 클래스를 정의한다.
2. 구체 클래스 정의
추상 클래스를 구현 할 구체적인 클래스들을 정의한다.
3. 추상 팩토리 클래스(인터페이스)
객체 생성을 위한 팩토리 메서드를 포함하는 추상 클래스를 정의한다.
4. 구체 팩토리 클래스(인터페이스)
추상 팩토리 클래스를 구현하는 구체적인 팩토리 클래스를 정의하여 객체 생성 로직을 구현한다.
장점
1. 객체 생성의 구체적인 구현을 서브클래스에서 정의할 수 있는 클래스 상속을 하기 때문에 새로운 객체 타입을
쉽게 확장할 수 있다.
2. 객체 생성 로직을 분리하여 새로운 객체 타입을 쉽게 추가할 수 있기 때문에 객체 생성에 있어서 굉장이 유연하다.
3. 클라이언트 코드가 구체적인 클래스에 의존하지 않아 클라이언트 코드가 단순화되고 코드의 유연성과 재사용성이 증가한다.
4. 객체 생성 책임을 팩토리 메서드로 분리하기 때문에 단일 책임 원칙을 준수한다.
단점
1. 팩토리 클래스를 상속받기 때문에 클래스 수가 증가하며 코드 구조가 복잡해질 수 있고
이는 어쩌면 팩토리 메서드를 사용하지 않을 때보다 구현이 어려울 수 있다.
자바와 파이썬에서의 팩토리 메서드 패턴 사용
난 예시로 특정 제품에 대한 팩토리 메서드 패턴을 사용해봤다.
자바(JAVA)
1. 추상 클래스(인터페이스)를 정의한다.
abstract class Product {
public abstract void use();
}
2. 구체 클래스를 정의한다.
class ConcreteProductA extends Product {
@Override
public void use() {
System.out.println("Using Product A");
}
}
class ConcreteProductB extends Product {
@Override
public void use() {
System.out.println("Using Product B");
}
}
3. 추상 팩토리 메서드 클래스(인터페이스)를 정의한다.
abstract class Creator {
public abstract Product factoryMethod();
public void someOperation() {
Product product = factoryMethod();
product.use();
}
}
4. 구체 팩토리 메서드를 정의한다.
class ConcreteCreatorA extends Creator {
@Override
public Product factoryMethod() {
return new ConcreteProductA();
}
}
class ConcreteCreatorB extends Creator {
@Override
public Product factoryMethod() {
return new ConcreteProductB();
}
}
파이썬(PYTHON)
Product 클래스는 추상 메서드 use()를 가지고 있고 이는 모든 제품이 공통으로 구현해야 할 인터페이스를 정의했다.
두 클래스는 Product 클래스를 상속 받아서 use() 메서드를 구체적으로 구현했다.
팩토리 메서드를 가지고 있는 Creator이라는 추상 메서드를 만들었고,
이는 객체 생성을 담당하는 메서드로 두었다.
some_operation() 메서드는 팩토리 메서드를 통해서 객체를 생성하고, 생성된 객체의 use() 메서드를 호출하는 역할을 한다.
추상 팩토리 메서드를 상속받은 Concreator A와 B 클래스는 팩토리 메서드를 상세 구현하고
각각의 객체를 생성하고 반환한다.
클라이언트 코드에서는 Concreator A와 B 클래스의 인스턴스를 생성하고
some_operation() 메서드를 호출하여 객체를 생성하고 사용한다.
이번주는 스터디 양이 기간에 비해 적어서 두가지 디자인 패턴에 대해 공부했다.
아무래도 객체지향에 관련된 디자인 패턴이다보니 추상화, 상속 두가지를 빼놓을 수 없었고
공부를 하면서 이게 과연 무슨 큰 차이가 있나? 헷갈려서 따로 정리해봤다.
팩토리 메서드 패턴과 템플릿 메서드 패턴
우선 팩토리 메서드 패턴과 템플릿 메서드 패턴은 둘 다 객체지향 설계 패턴으로서
코드의 재사용성과 유연성을 높이는 동일한 목적을 가진 디자인 패턴이다.
하지만 이 둘은 목적과 사용 방식에서 근본적인 차이가 있다.
목적
팩토리 메서드 패턴
주로 객체 생성의 책임을 캡슐화하고, 객체 생성 로직을 하위 클래스로 위임하여 다양한 종류의 객체를 유연하게 생성하는 것이
목적인 디자인 패턴으로 객체 생성의 유연성을 제공하며, 클라이언트 코드가 구체적인 클래스에 의존하지 않도록 한다.
템플릿 메서드 패턴
알고리즘의 골격을 상위 클래스에서 정의하고, 알고리즘의 구체적인 단계는 하위 클래스에서 구현하도록 하는 것이 목적으로
알고리즘의 구조를 재사용하고, 알고리즘의 특정 단계를 하위 클래스에서 자유롭게 구현할 수 있도록 한다.
사용 방법
팩토리 메서드 패턴
추상 팩토리 클래스를 정의하고, 객체를 생성하는 추상 메서드를 선언한 뒤
구체적인 팩토리 클래스에서 이 추상 메서드를 구현하여 다양한 객체를 생성하는 방식으로 사용된다.
템플릿 메서드 패턴
상위 클래스에서 알고리즘의 전체 구조를 정의하는 메서드를 제공하고, 알고리즘의 각 단계를 추상 메서드나 기본 메서드로 정의하고서
하위 클래스에서 이러한 추상 메서드를 구현하여 알고리즘의 구체적인 단계를 제공한다.
즉, 한줄로 요약해보면
팩토리 메서드 패턴은 객체 생성을 위한 패턴이고 객체 생성의 캡슐화와 다양성에 초점이 맞춰져 있으며 팩토리 메서드를 통해 객체 생성을 한다.
템플릿 메서드 패턴은 알고리즘 구조를 정의하기 위한 패턴이고 알고리즘의 단계별 구현과 재사용성에 초점이 맞춰져 있으며 템플릿 메서드를
통해 알고리즘의 큰 골격을 형성하고 세부 구현을 하위 클래스에서 제공한다.
팩토리 메서드 패턴은 객체 생성을 관리하고 유연성을 제공!!
템플릿 메서드 패턴은 알고리즘의 구조를 관리하고 재사용성을 제공!!
'🪄Interview > ✏️Study' 카테고리의 다른 글
[CS STUDY INTERVIEW] 16주차 - 옵저버 패턴 & 스트레티지 패턴 & 컴포지트 패턴 (0) | 2024.07.16 |
---|---|
[CS STUDY INTERVIEW] 15주차 - 싱글톤 패턴 (0) | 2024.07.06 |
[CS STUDY INTERVIEW] 14주차 - 템플릿 메서드 패턴 (1) | 2024.06.19 |
[CS STUDY INTERVIEW] 13주차 - 어댑터 패턴 (0) | 2024.06.05 |
[CS STUDY INTERVIEW] 12주차 - Stream API (0) | 2024.05.25 |