[디자인 패턴] Factory Pattern

전성훈·2023년 11월 1일
0

DesignPattern

목록 보기
6/18
post-thumbnail

주제: 공통의 함수가 들어간 생성라인


Factory Method Pattern은 부모(상위) 클래스에 알려지지 않은 구체 클래스를 생성하는 패턴이며, 자식(하위) 클래스가 어떤 객체를 생성할지를 결정하도록 하는 패턴이기도 하다.
부모 클래스 코드에 구체 클래스 이름을 감추기 위한 방법으로도 사용한다.

펙토리 패턴이란

  • 생성 패턴 중 하나로서, 객체를 생성하는 인터페이스를 정의하고 이를 통해 어떤 클래스의 인스턴스를 생성할지는 서브 클래스에서 결정하도록 하는 디자인 패턴이다. 이는 객체 생성의 복잡성을 추상화하고, 코드의 결합도를 낮추는 데 도움을 준다.

주요 객체 살펴보기

펙토리 패턴

  1. Creator
    • Factory에 기본 역할을 정의하는 객체
  2. Concrete Creator
    • Creator를 채택하고 있으며 Product에 맞는 구체적 기능을 구현
  3. Product
    • Concrete Product가 해야할 동작들을 선언하는 객체
  4. Concrete Product
    • Product를 채택하며 그에 맞게 만든 실제 객체

장점

  • 프로토콜로 기본 기능을 정의해주었기 때문에 기존 코드를 변경하지 않아도 되며, 유연하고 확장성이 높다.
  • 코드에 수정 사항이 생기더라도 팩토리 메소드만 수정하면 되기 때문에 수정에 용이하다.

단점

  • Product가 추가될 때마다 새롭게 하위 클래스를 정의해주어야 하기 때문에 불필요하게 많은 클래스가 정의되어 질 수 있다.
  • 중첩되어 사용되면 매우 복잡해질 우려가 있다.

예시 코드

예시 코드 1

  • Factory를 프로토콜화 하고 각자의 맞는 클래스 생성
import Foundation

protocol AppleFactory {
    func createElectronics() -> Product
}

class IPhoneFactory: AppleFactory {
    func createElectronics() -> Product {
        return IPhone()
    }
}

class IPadFactory: AppleFactory {
    func createElectronics() -> Product {
        return IPad()
    }
}


protocol Product {
    func produceProduct()
}

class IPhone: Product {
    func produceProduct() {
        print("IPhone was made")
    }
}

class IPad: Product {
    func produceProduct() {
        print("IPad was made")
    }
}

class Client {
    func order(factory: AppleFactory) {
        let electronicsProduct = factory.createElectronics()
        electronicsProduct.produceProduct()
    }
}

var client = Client()
client.order(factory: IPadFactory())

예시 코드 2

  • Factory를 하나의 클래스로 만들며, 각자의 맞는것은 switch로 분기화
protocol Shape {
    func draw()
}

class Rectangle: Shape {
    func draw() {
        print("Rectangle")
    }
}

class Circle: Shape {
    func draw() {
        print("Circle")
    }
}

class ShapeFactory {
    func createShape(type: String) -> Shape? {
        switch type {
        case "rectangle":
            return Rectangle()
        case "circle":
            return Circle()
        default:
            return nil
        }
    }
}

let factory = ShapeFactory()

if let shape1 = factory.createShape(type: "rectangle") {
    shape1.draw()
}

if let shape2 = factory.createShape(type: "circle") {
    shape2.draw()
}

출처(참고문헌)

제가 학습한 내용을 요약하여 정리한 것입니다. 내용에 오류가 있을 수 있으며, 어떠한 피드백도 감사히 받겠습니다.

감사합니다.

0개의 댓글