VB.NET 디자인 패턴 - 2. 팩토리 메소드 패턴 (Factory Method Pattern)

2023. 4. 20. 13:21VB.NET/디자인 패턴

팩토리 메소드 패턴은 객체 생성 과정을 추상화하고, 객체를 팩토리 클래스에서 생성함으로써 객체 생성 과정의 변경이나 확장에 유연하게 대처할 수 있도록 합니다. 팩토리 메소드 패턴은 객체 생성 과정에서 나타나는 중복 코드를 제거하고, 코드의 재사용성을 높일 수 있습니다.

팩토리 메소드 패턴의 구성요소

팩토리 메소드 패턴은 다음과 같은 구성요소로 이루어져 있습니다.

  • 추상 팩토리 (Abstract Factory) : 객체 생성을 추상화한 인터페이스입니다. 팩토리 메소드 패턴에서는 이 추상 팩토리를 구현하여 객체를 생성합니다.
  • 구체적인 팩토리 (Concrete Factory) : 추상 팩토리의 인터페이스를 구현하는 클래스입니다. 이 클래스는 객체를 생성하는 구체적인 메소드를 구현합니다.
  • 추상 제품 (Abstract Product) : 객체 생성에 필요한 인터페이스를 제공합니다.
  • 구체적인 제품 (Concrete Product) : 추상 제품의 인터페이스를 구현하는 클래스입니다. 이 클래스는 객체를 생성하는 구체적인 메소드를 구현합니다.

팩토리 메소드 패턴의 예시

팩토리 메소드 패턴을 예시를 통해 살펴보겠습니다. 예를 들어, 컴퓨터를 생산하는 공장이 있다고 가정해봅시다. 이 공장은 각각 다른 스펙을 가진 컴퓨터를 생산합니다. 이 때 팩토리 메소드 패턴을 사용하여 객체 생성을 처리할 수 있습니다.

추상 팩토리 (Abstract Factory)

Public Interface IAbsFactory
    Function CreateComputer() As IAbsProduct
End Interface

구체적인 팩토리 (Concrete Factory)

Public Class HighFactory Implements IAbsFactory
    Public Function CreateComputer() As IAbsProduct Implements IAbsFactory.CreateComputer
        Return New HighComputer()
    End Function
End Class

Public Class LowFactory Implements IAbsFactory
    Public Function CreateComputer() As IAbsProduct Implements IAbsFactory.CreateComputer
        Return New LowComputer()
    End Function
End Class

추상 제품 (Abstract Product)

Public Interface IAbsProduct
    Function GetSpec() As String
End Interface

구체적인 제품 (Concrete Product)

Public Class HighComputer Implements IAbsProduct
    Public Function GetSpec() As String Implements IAbsProduct.GetSpec
        Return "High-end computer"
    End Function
End Class

Public Class LowComputer Implements IAbsProduct
    Public Function GetSpec() As String Implements IAbsProduct.GetSpec
        Return "Low-end computer"
    End Function
End Class

위의 코드에서 HighFactory 클래스와 LowFactory 클래스는 IAbsFactory 인터페이스를 구현하고 있습니다. 이 클래스들은 각각 고사양 컴퓨터와 저사양 컴퓨터를 생성합니다. 각각의 팩토리 클래스에서 CreateComputer 메소드를 구현하여 구체적인 컴퓨터 객체를 생성하고 반환합니다.

 

또한, HighComputer 클래스와 LowComputer 클래스는 IAbsProduct 인터페이스를 구현하고 있습니다. 이 클래스들은 GetSpec 메소드를 구현하여 해당 컴퓨터의 스펙을 반환합니다.

 

팩토리 메소드 패턴을 사용하면 다음과 같이 간단하게 객체를 생성할 수 있습니다.

Dim HighFa As New HighFactory()
Dim HighComputer As IAbsProduct = HighFa.CreateComputer()
Console.WriteLine(HighComputer.GetSpec()) ' High-end computer 출력

Dim LowFa As New LowFactory()
Dim LowComputer As IAbsProduct = LowFa.CreateComputer()
Console.WriteLine(LowComputer.GetSpec()) ' Low-end computer 출력

위의 코드에서는 먼저 HighFactory 클래스와 LowFactory 클래스를 생성하고, 이들 팩토리 클래스를 사용하여 High-end 컴퓨터와 Low-end 컴퓨터를 생성합니다. 생성된 컴퓨터 객체의 GetSpec 메소드를 호출하여 해당 컴퓨터의 스펙을 출력합니다.

팩토리 메소드 패턴의 장점

  • 코드의 재사용성이 높아집니다. 객체 생성 코드를 한 곳에 모아놓기 때문에, 여러 곳에서 객체 생성 코드를 중복해서 작성하지 않아도 됩니다.
  • 객체 생성 과정에서 일어나는 변경이나 확장에 대처할 수 있습니다. 새로운 제품을 추가하거나 제품의 생성 과정이 변경될 경우, 팩토리 클래스만 수정하면 됩니다. 이는 코드의 유연성과 확장성을 높여줍니다.
  • 객체 생성 과정을 캡슐화할 수 있습니다. 팩토리 클래스는 객체 생성에 대한 구체적인 구현을 캡슐화하고, 클라이언트 코드에서는 이를 알 필요가 없습니다.
  • 코드의 가독성이 높아집니다. 팩토리 메소드 패턴을 사용하면 객체 생성 코드를 추상화하고, 객체 생성과 관련된 코드가 분리되므로 코드의 가독성이 높아집니다.

팩토리 메소드 패턴의 단점

  • 팩토리 클래스가 추가되면서 코드의 복잡도가 증가할 수 있습니다. 이는 팩토리 클래스의 수가 많아질수록 더욱 심해집니다.
  • 팩토리 메소드 패턴을 사용하면서 객체 생성에 대한 코드 추상화가 지나치게 될 경우, 객체 생성 과정을 이해하기 어려워질 수 있습니다.
  • 팩토리 메소드 패턴은 객체 생성에만 관여하는 팩토리 클래스와 객체를 사용하는 클라이언트 클래스가 분리됩니다. 이는 객체를 사용하기 위해 두 클래스를 계속해서 호출해야 한다는 번거로움을 초래할 수 있습니다.

 

마치며...

팩토리 메소드 패턴은 객체 생성 코드를 추상화하여 코드의 유연성과 확장성을 높이는 장점이 있지만, 팩토리 클래스의 추가로 인한 코드 복잡도가 증가하고, 객체 생성 과정의 이해도가 낮아지는 등의 단점도 가지고 있습니다.

 

관련글 : 2023.04.19 - [VB.NET/디자인 패턴] - VB.NET에서의 디자인 패턴

 

VB.NET에서의 디자인 패턴

소프트웨어 개발은 그저 코드를 작성하는 것이 아니라, 잘 구조화된 코드를 작성해야합니다. 디자인 패턴은 소프트웨어 아키텍처와 구조를 구성하는 데 사용되는 효율적인 방법입니다. 이번 블

chakhani.tistory.com

 

반응형