팩토리 메소드 패턴(Factory Method Pattern)
- 객체 생성을 클라이언트 코드로부터 분리하고, 객체의 생성 방식을 하위 클래스에 위임하는 패턴
- 사용 방법
- 인터페이스나 추상 클래스를 사용하여 팩토리를 정의
- 인터페이스/추상 클래스를 상속하는 하위 클래스에서 팩토리 메소드 구현
- 클라이언트 코드에서는 인터페이스/추상 클래스를 통해 객체를 생성하며, 구체적인 팩토리 클래스는 런타임에 선택되거나 주입
- 장점
- 확장성 : 팩토리 클래스를 확장하여 객체 생성 로직을 쉽게 변경하거나 다양한 조건에 따라 객체 생성을 커스터마이징 할 수 있다. → 개방-폐쇄 원칙(OCP)
- 확장성 : 팩토리 클래스를 확장하여 객체 생성 로직을 쉽게 변경하거나 다양한 조건에 따라 객체 생성을 커스터마이징 할 수 있다. → 개방-폐쇄 원칙(OCP)
- 단점
- 복잡성 : 클래스 계층 구조가 더 복잡해 질 수 있다.
구현 코드
// Step 1: 팩토리 인터페이스
interface ShapeFactory {
Shape createShape();
}
// Step 2: 구체적인 팩토리 클래스 1 - 원을 생성하는 팩토리
class CircleFactory implements ShapeFactory {
@Override
public Shape createShape() {
return new Circle();
}
}
// Step 3: 구체적인 팩토리 클래스 2 - 사각형을 생성하는 팩토리
class RectangleFactory implements ShapeFactory {
@Override
public Shape createShape() {
return new Rectangle();
}
}
// Step 4: 추상 생성 클래스
abstract class Shape {
abstract void draw();
}
// Step 5: 구체적인 생성 클래스 1 - 원
class Circle extends Shape {
@Override
void draw() {
System.out.println("원을 그립니다.");
}
}
// Step 6: 구체적인 생성 클래스 2 - 사각형
class Rectangle extends Shape {
@Override
void draw() {
System.out.println("사각형을 그립니다.");
}
}
// 클라이언트 코드
public class FactoryMethodDemo {
public static void main(String[] args) {
// 원을 생성하는 팩토리
ShapeFactory circleFactory = new CircleFactory();
Shape circle = circleFactory.createShape();
circle.draw();
// 사각형을 생성하는 팩토리
ShapeFactory rectangleFactory = new RectangleFactory();
Shape rectangle = rectangleFactory.createShape();
rectangle.draw();
}
}
'ShapeFactory' 인터페이스를 사용하여 도형을 생성하는 팩토리를 정의하고, 각 도형에 대한 구체적인 팩토리 클래스('CircleFactory'와 'RectangleFactory')를 구현한다. 클라이언트 코드에서는 팩토리를 사용하여 도형을 생성하고, 각 도형 클래스('Circle'과 'Rectangle')는 공통 메소드 'draw()'를 구현한다.
'Computer Science > Design Pattern' 카테고리의 다른 글
[Design Pattern] 옵저버 패턴 (Observer Pattern) (0) | 2023.10.08 |
---|---|
[Design Pattern] 컴포지트 패턴 (Composite Pattern) (0) | 2023.10.08 |
[Design Pattern] 템플릿 메소드 패턴 (Template Method Pattern) (0) | 2023.09.23 |
[Design Pattern] 싱글톤 패턴 (Singleton Pattern) (0) | 2023.09.23 |
[Design Pattern] 어댑터 패턴 (Adapter Pattern) (0) | 2023.09.22 |