팩토리 메서드 패턴은 위와 같은 구조를 가지고 있습니다.
Interface
를 선언합니다. Interface는 Creater와 하위 클래스들이 생성할 수 있는 모든 객체에서 동일합니다.Product
가 선언한 interface로 만든 실제 객체입니다.Factory Method
를 선언합니다. 중요한 점은 이 factory method의 반환 유형이 product interface와 일치해야합니다.일단 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를 추가하고 싶다면 위의 코드를 수정하지 않고 팩토리 부분만 수정해주면 됩니다.