VB.NET 디자인 패턴 - 3. 추상 팩토리 패턴 (Abstract Factory Pattern)

2023. 4. 21. 10:51VB.NET/디자인 패턴

추상 팩토리 패턴은 객체 생성에 관한 패턴으로, 객체를 생성하는 방법과 객체들이 서로 연관되어 생성되어야 할 경우에 사용됩니다. 이 패턴은 객체 생성을 추상화하고, 구체적인 클래스를 분리시킴으로써, 코드의 재사용성과 유지보수성을 향상시킵니다.

 

추상 팩토리 패턴 (Abstract Factory Pattern)

추상 팩토리 패턴의 구조

추상 팩토리 패턴은 Abstract Factory, Concrete Factory, Abstract Product, Concrete Product, Client로 구성됩니다.

  • Abstract Factory: 추상 팩토리는 객체 생성에 대한 추상화를 담당합니다.
  • Concrete Factory: 구체적인 팩토리 클래스는 추상 팩토리를 구현합니다.
  • Abstract Product: 추상 팩토리가 생성할 객체에 대한 추상화를 담당합니다.
  • Concrete Product: 구체적인 객체를 생성합니다.
  • Client: 추상 팩토리, 추상 객체를 사용합니다.

추상 팩토리 패턴의 예시

윈도우 응용프로그램에서 버튼, 텍스트박스, 라벨 등의 UI 컨트롤을 생성할 때, 추상 팩토리 패턴을 사용할 수 있습니다. 추상 팩토리는 각각의 컨트롤을 생성하는 팩토리를 추상화하고, 각 팩토리는 추상화된 컨트롤을 구현합니다. 이렇게 구현된 추상 팩토리를 사용하여, 클라이언트에서는 각각의 컨트롤을 생성할 때, 추상 팩토리를 사용합니다.

추상 팩토리 패턴의 장점

  • 객체 생성에 대한 추상화를 제공하여, 코드의 유연성과 재사용성을 향상시킵니다.
  • 각 팩토리 클래스가 추상화된 인터페이스를 구현하므로, 확장성이 높습니다.
  • 코드를 간결하고 만들어서 가독성을 높여줍니다.

추상 팩토리 패턴의 단점

  • 새로운 제품을 추가하려면, 새로운 추상화된 팩토리 인터페이스를 정의하고, 모든 구체 팩토리 클래스에서 해당 인터페이스를 구현해야 합니다. 이는 코드의 복잡성을 증가시키고, 개발 시간을 늘릴 수 있습니다.
  • 팩토리 클래스의 수가 많아질 수록, 코드의 관리가 어려워집니다.

추상 팩토리 패턴의 예제 코드

Public MustInherit Class AbstractFactory
    Public MustOverride Function CreateProductA() As AbstractProductA
    Public MustOverride Function CreateProductB() As AbstractProductB
End Class

Public Class ConcreteFactory1
    Inherits AbstractFactory

    Public Overrides Function CreateProductA() As AbstractProductA
        Return New ConcreteProductA1()
    End Function

    Public Overrides Function CreateProductB() As AbstractProductB
        Return New ConcreteProductB1()
    End Function
End Class

Public Class ConcreteFactory2
    Inherits AbstractFactory

    Public Overrides Function CreateProductA() As AbstractProductA
        Return New ConcreteProductA2()
    End Function

    Public Overrides Function CreateProductB() As AbstractProductB
        Return New ConcreteProductB2()
    End Function
End Class

Public MustInherit Class AbstractProductA
    Public MustOverride Sub DoSomething()
End Class

Public MustInherit Class AbstractProductB
    Public MustOverride Sub DoSomething()
End Class

Public Class ConcreteProductA1
    Inherits AbstractProductA

    Public Overrides Sub DoSomething()
        Console.WriteLine("ConcreteProductA1 DoSomething")
    End Sub
End Class

Public Class ConcreteProductA2
    Inherits AbstractProductA

    Public Overrides Sub DoSomething()
        Console.WriteLine("ConcreteProductA2 DoSomething")
    End Sub
End Class

Public Class ConcreteProductB1
    Inherits AbstractProductB

    Public Overrides Sub DoSomething()
        Console.WriteLine("ConcreteProductB1 DoSomething")
    End Sub
End Class

Public Class ConcreteProductB2
    Inherits AbstractProductB

    Public Overrides Sub DoSomething()
        Console.WriteLine("ConcreteProductB2 DoSomething")
    End Sub
End Class

Public Class Client
    Private ReadOnly factory As AbstractFactory
    Private ReadOnly productA As AbstractProductA
    Private ReadOnly productB As AbstractProductB

    Public Sub New(factory As AbstractFactory)
        Me.factory = factory
        productA = factory.CreateProductA()
        productB = factory.CreateProductB()
    End Sub

    Public Sub Run()
        productA.DoSomething()
        productB.DoSomething()
    End Sub
End Class

Module Program
    Sub Main(args As String())
        Dim factory1 As New ConcreteFactory1()
        Dim client1 As New Client(factory1)
        client1.Run()

        Dim factory2 As New ConcreteFactory2()
        Dim client2 As New Client(factory2)
        client2.Run()

        Console.ReadLine()
    End Sub
End Module

마치며...

추상 팩토리(Abstract Factory) 패턴은 팩토리 메소드 패턴보다는 한 단계 높은 추상 요소입니다. 이 패턴을 이용하면 조건에 따라 서로 다른 클래스 객체를 반환하게 됩니다.

 

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

 

VB.NET에서의 디자인 패턴

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

chakhani.tistory.com

 

반응형