Factory Method Patten

박성민·2023년 5월 16일
0

디자인패턴

목록 보기
1/2

팩토리 메서드란?

  • 팩토리 메서드는 부모 클래스에서 객체들을 생성할 수 있는 인터페이스를 제공하지만, 자식 클래스들이 생성될 객체들의 유형을 변경할 수 있도록 하는 생성 패턴입니다.
  • 간단하게 말해서 객체 생성을 서브 클래스가 하도록 처리하는 패턴입니다.
  • 팩토리 메서드는 product 생성 코드를 실제로 사용하는 코드와 분리합니다. 따라서 product 생성 코드를 독립적으로 확장하기 쉬워집니다. 예를 들어 앱에 새로운 product를 추가하려면 새로운 concrete creator의 팩토리 메서드만 override하면 됩니다.

팩토리 메서드 패턴 구조

팩토리 메서드 패턴은 위와 같은 구조를 가지고 있습니다.

  • Product: Interface를 선언합니다. Interface는 Creater와 하위 클래스들이 생성할 수 있는 모든 객체에서 동일합니다.
  • Concrete Product: Product가 선언한 interface로 만든 실제 객체입니다.
  • Creator: 새로운 product 객체들을 반환하는 Factory Method를 선언합니다. 중요한 점은 이 factory method의 반환 유형이 product interface와 일치해야합니다.
  • Concrete Creator: 기본 팩토리 메서드를 override하여 서로 다른 Product 객체를 만들 수 있습니다.

팩토리 메서드 사용 예시

일단 Product에 해당하는 Shape 프로토콜을 작성하였습니다.

// Product Interface
protocol Shape {
	var name: String { get }
    func draw()
}

product protocol을 채택하는 concreate products를 만듭니다.

class Circle: Shape {
	var name: String = "Circle"
    
    func draw() {
    	print("draw circle")
    }
}

class Rectangle: Shape {
	var name: String = "Rectangle"
    
    func draw() {
    	print("draw rectangle")
    }
}

그런 다음 Creator를 만듭니다.

protocol ShapeCreator {
	func createShape(shapeType: ShapeType) -> Shape
}

enum ShapeType {
	case circle
    case rectangle
}

그 다음 Factory를 만들면 됩니다.

// Factory (Concrete Creator)
class ShapeFactory: ShapeCreator {
	func createShape(shapeType: ShapeType) -> Shape {
    	switch shapeType {
    	case .circle:
    		return Circle()
    	case .rectangle:
    		return Rectangle()
		}
	}
}

이제 shape 객체를 만들 때 factory 객체를 사용해서 만들면 됩니다.

손쉽게 서로 다른 Shape를 만들어서 사용할 수 있게 되었습니다.
만약 다른 Shape를 추가하고 싶다면 위의 코드를 수정하지 않고 팩토리 부분만 수정해주면 됩니다.

장단점

장점

  • creator와 concrete product가 느슨한 결합을 유지할 수 있습니다.
  • 단일책임원칙. product 생성코드를 한 곳으로 이동하여 더 쉽게 유지보수 할 수 있습니다.
  • 개방/폐쇄 원칙. 기존 클라이언트 코드를 훼손하지 않고 새로운 타입의 product들을 도입할 수 있습니다.

단점

  • 패턴을 구현하기 위해 많은 새로운 서브 클래스들을 도입해야하므로 코드가 더 복잡해 질 수 있습니다.

참고 자료

profile
iOS시작~

0개의 댓글