Developing Myself Everyday

팩토리 패턴이란?


 팩토리 패턴(Factory Pattern)은 객체를 생성할 때 사용되는 디자인 패턴이다. 이 패턴은 객체 생성을 캡슐화하고, 클라이언트 코드와 객체 생성 코드를 분리함으로써 유연성과 확장성을 제공한다.

 

 일반적으로 팩토리 패턴은 추상화된 인터페이스를 정의하고, 이를 구현하는 여러개의 팩토리 클래스를 만들어 사용한다. 클라이언트는 팩토리 인터페이스를 통해 객체를 생성하고 반환받을 수 있다. 팩토리 클래스는 객체 생성에 대한 로직을 구현하고, 실제 객체의 인스턴스를 생성하여 반환한다.

 

 간단하게 말하자만 객체를 생성하는 부분을 Sub Class에 맡긴다고 생각하면 된다.

 

 

팩토리 패턴은 다음과 같은 장점이 있다.

  • 객체의 생성을 중앙집중화해 코드의 유지보수성과 확장성을 향상시킨다.
  • 구체적인 구현클래스에 의존하지 않고 인터페이스에 의존할 수 있도록해 유연성과 확장성을 증가시키고 결합도를 낮춘다.
  • 클라이언트는 단순히 팩토리에게 객체 생성을 요청하면 되므로 객체 생성에 대한 세부 사항을 알 필요가 없다.

팩토리 패턴은 다음과 같은 단점이 있다.

  • 별도의 팩토리 클래스나 메서드가 필요하므로, 코드의 복잡성이 증가할 수 있다. 추가적인 추상화 계층이 필요하며, 팩토리 클래스나 메서드를 작성해야 하므로, 개발 비용이 증가할 수 있다.
  • 객체 생성을 중앙화함으로, 객체 생성에 대한 유연성이 제한된다. 
  • 새로운 종류의 객체를 추가하려면 팩토리 클래스나 메서드를 수정해야 할 수 있으며, 이는 일부 수정이 필요한 경우에는 번거로울 수 있다.

 

 

팩토리 패턴의 종류

 팩토리 패턴은 크게 추상 팩토리 패턴(Abstract Factory Pattern)과 팩토리 메소드 패턴(Factory Method Pattern)으로 구분할 수 있다. 둘의 역할은 대동소이하다. 모두 객체 생성을 추상화하고 유연성을 제공하기 위한 패턴이다. 그러나 추상 팩토리 패턴은 관련된 여러 개의 제품군을 생성하기 위한 패턴으로 사용되며, 팩토리 메소드 패턴은 단일 제품군의 객체를 생성하기 위한 패턴으로 사용된다.

 

 

예시


 아래의 코드에서는 Shape 라는 제품 인터페이스를 정의하고, 이를 구현한 Rectagle과 Circle 이라는 제품 클래스를 만든다. 또한 ShapgeFactory라는 팩토리 인터페이스를 정의하고, 각각의 제품을 생성하는 Rectangle Factory와 CircleFactory 클래스를 만든다.
 메인 함수에서는 원하는 팩토리를 선택하고 해당 팩토리로부터 제품을 생성한다. 생성된 제품은 동일한 인터페이스를 사용한다. 이렇게 하면 클라이언트 코드는 구체적인 제품의 생성 로직을 알 필요없이 팩토리를 통해 제품을 생성하고 사용할 수 있다.

// 제품(Product) 인터페이스
interface Shape {
    fun draw()
}

// 제품1: 사각형
class Rectangle : Shape {
    override fun draw() {
        println("Drawing a Rectangle")
    }
}

// 제품2: 원
class Circle : Shape {
    override fun draw() {
        println("Drawing a Circle")
    }
}

// 팩토리 인터페이스
interface ShapeFactory {
    fun createShape(): Shape
}

// 사각형을 생성하는 팩토리
class RectangleFactory : ShapeFactory {
    override fun createShape(): Shape {
        return Rectangle()
    }
}

// 원을 생성하는 팩토리
class CircleFactory : ShapeFactory {
    override fun createShape(): Shape {
        return Circle()
    }
}

// 사용 예시
fun main() {
    val rectangleFactory: ShapeFactory = RectangleFactory()
    val rectangle: Shape = rectangleFactory.createShape()
    rectangle.draw() // Output: Drawing a Rectangle

    val circleFactory: ShapeFactory = CircleFactory()
    val circle: Shape = circleFactory.createShape()
    circle.draw() // Output: Drawing a Circle
}
profile

Developing Myself Everyday

@배준형

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!