Search

추상 팩토리 패턴

개요

추상 팩토리 패턴(Abstract Factory Pattern)은 객체를 생성하는 디자인 패턴 중 하나입니다. 이 패턴은 객체 생성에 대한 추상화를 제공하며, 서로 관련이 있는 객체들을 함께 생성하고 조합하는 데 사용됩니다.
일반적으로 추상 팩토리 패턴은 인터페이스를 통해 추상화된 팩토리 클래스를 정의하고, 이 팩토리 클래스에서는 서로 다른 구현체들을 생성하는 메서드를 제공합니다. 이렇게 팩토리 클래스를 통해 객체 생성을 추상화하면, 코드의 유지보수성이 좋아지고, 유연성이 높아집니다.
classDiagram
class AbstractFactory{
    + createProductA(): AbstractProductA
    + createProductB(): AbstractProductB
}

class ConcreteFactory1{
    + createProductA(): ProductA1
    + createProductB(): ProductB1
}

class ConcreteFactory2{
    + createProductA(): ProductA2
    + createProductB(): ProductB2
}

class AbstractProductA{
    + operation(): string
}

class AbstractProductB{
    + operation(): string
}

class ProductA1{
    + operation(): string
}

class ProductB1{
    + operation(): string
}

class ProductA2{
    + operation(): string
}

class ProductB2{
    + operation(): string
}

AbstractFactory <|-- ConcreteFactory1
AbstractFactory <|-- ConcreteFactory2
AbstractProductA <|-- ProductA1
AbstractProductA <|-- ProductA2
AbstractProductB <|-- ProductB1
AbstractProductB <|-- ProductB2
Mermaid
복사

추상 팩토리 패턴

추상 팩토리 패턴에서는, 추상 팩토리를 사용하여 객체를 생성합니다. 추상 팩토리는 인터페이스로 정의되며, 객체를 생성하기 위한 추상 메서드를 제공합니다. 이 추상 메서드는 구체적인 팩토리 클래스에서 구현됩니다.
각 팩토리 클래스는 서로 다른 종류의 객체를 생성합니다. 이러한 객체는 팩토리 클래스에 의해 생성되고, 반환되는 인터페이스에 의해 구체화됩니다. 이는 코드를 유연하게 만들어줍니다. 새로운 종류의 객체를 추가하기 위해서는, 새로운 팩토리 클래스를 추가하기만 하면 됩니다.
추상 팩토리 패턴을 사용하면, 여러 종류의 객체를 생성할 때마다, 해당 객체에 대한 구현체를 선택해야하는 경우가 있습니다. 예를 들어, GUI 애플리케이션에서는 사용자 인터페이스 요소를 생성할 때, 다양한 플랫폼(윈도우, 맥, 리눅스 등)에서 동작할 수 있도록 구현체를 선택해야 합니다. 이 경우, 추상 팩토리 패턴을 사용하면, 플랫폼별로 구현된 팩토리 클래스를 제공하여, 각 플랫폼에 맞는 구현체를 생성할 수 있습니다.
추상 팩토리 패턴은 객체 생성의 책임을 팩토리 클래스에게 위임하므로, 객체 간의 결합도를 낮출 수 있습니다. 또한, 새로운 객체 타입이 추가되더라도, 팩토리 클래스를 수정하여 해당 객체의 생성을 추가하기만 하면 됩니다. 따라서 추상 팩토리 패턴은 코드의 확장성과 유지보수성을 향상시키는 데 유용합니다.

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

classDiagram
classDef abstractFactoryInterface shape
classDef concreteFactoryClass shape
classDef abstractProductInterface shape
classDef concreteProductClass shape
classDef client shape

abstractFactoryInterface <|.. concreteFactoryClass
abstractFactoryInterface <|.. abstractProductInterface
concreteFactoryClass --> concreteProductClass
abstractProductInterface <|.. concreteProductClass
client --> abstractFactoryInterface
client --> abstractProductInterface
client --> concreteProductClass
Mermaid
복사

Abstract Factory Interface (추상 팩토리 인터페이스)

추상 팩토리 패턴에서 가장 중요한 구성요소입니다. 이 인터페이스는 일련의 관련 객체들을 생성하기 위한 메서드를 선언합니다. 이 인터페이스를 구현하는 구상 팩토리 클래스는 실제 객체를 생성하게 됩니다.

Concrete Factory (구상 팩토리 클래스)

추상 팩토리 인터페이스를 구현하여 실제 객체를 생성합니다. 이 클래스는 일련의 관련 객체를 생성하는데 사용됩니다.

Abstract Product Interface (추상 제품 인터페이스)

추상 팩토리 패턴에서 생성될 객체들에 대한 공통 인터페이스를 제공합니다. 이 인터페이스는 팩토리가 생성할 객체의 유형과 기능을 결정합니다.

Concrete Product (구상 제품 클래스)

추상 제품 인터페이스를 구현하여 구체적인 객체를 생성합니다. 이 클래스는 팩토리에 의해 생성될 실제 객체입니다.

Client (클라이언트)

팩토리 클래스와 추상 제품 인터페이스를 사용하여 객체를 생성합니다. 이 클라이언트는 구상 팩토리 클래스를 직접 호출하지 않고, 추상 팩토리 인터페이스를 통해 객체를 생성합니다.

팩토리 메서드를 사용한 객체 생성

추상 팩토리 패턴을 사용하면, 객체 생성 로직을 캡슐화할 수 있습니다. 이를 통해, 객체 생성 코드를 클라이언트로부터 분리시키고, 더욱 추상화된 인터페이스를 제공할 수 있습니다. 이는 코드의 유연성을 높여주며, 객체 생성 로직의 변경이 필요한 경우에도 클라이언트 코드를 수정할 필요가 없습니다.
interface GuiFactory { Button createButton(); Label createLabel(); } class WinGuiFactory implements GuiFactory { Button createButton() { return new WinButton(); } Label createLabel() { return new WinLabel(); } } class MacGuiFactory implements GuiFactory { Button createButton() { return new MacButton(); } Label createLabel() { return new MacLabel(); } }
Java
복사
위의 코드 예시에서는, GuiFactory 인터페이스를 정의하고 있습니다. 이 인터페이스는 createButtoncreateLabel이라는 추상 메서드를 제공합니다. WinGuiFactoryMacGuiFactory 클래스는 각각 GuiFactory 인터페이스를 구현하고 있습니다.
interface Button { void paint(); } class WinButton implements Button { public void paint() { System.out.println("Windows button painted"); } } class MacButton implements Button { public void paint() { System.out.println("Mac button painted"); } }
Java
복사
각 팩토리 클래스는 서로 다른 종류의 객체를 생성합니다. 이 예제에서는, WinGuiFactory 클래스는 WinButtonWinLabel 객체를 생성하고, MacGuiFactory 클래스는 MacButtonMacLabel 객체를 생성합니다.
GuiFactory factory; Button button; Label label; factory = new WinGuiFactory(); button = factory.createButton(); label = factory.createLabel(); button.paint(); label.paint(); factory = new MacGuiFactory(); button = factory.createButton(); label = factory.createLabel(); button.paint(); label.paint();
Java
복사
위의 코드 예시에서는, WinGuiFactory 클래스와 MacGuiFactory 클래스를 사용하여 ButtonLabel 객체를 생성하고 있습니다. 이를 통해, 객체 생성 로직을 캡슐화하고, 클라이언트 코드를 더욱 추상화된 인터페이스로 구현할 수 있습니다.

사용 예

1.
GUI 프로그래밍: 추상 팩토리 패턴을 사용하여, 서로 다른 플랫폼에서 동작할 수 있는 일관된 모양의 사용자 인터페이스를 만들 수 있습니다. 예를 들어, Windows, Mac, Linux 등 서로 다른 플랫폼에서 동작할 수 있는 일관된 모양의 버튼, 메뉴, 창 등을 생성할 수 있습니다.
2.
데이터베이스 연결: 추상 팩토리 패턴을 사용하여, 서로 다른 데이터베이스 관리 시스템에서 데이터베이스 연결을 생성할 수 있습니다. 예를 들어, MySQL, Oracle, SQL Server 등 서로 다른 데이터베이스 관리 시스템에서 데이터베이스 연결을 생성할 수 있습니다.
3.
네트워크 프로토콜: 추상 팩토리 패턴을 사용하여, 서로 다른 프로토콜에서 데이터 전송을 위한 일관된 인터페이스를 만들 수 있습니다. 예를 들어, HTTP, FTP, SMTP 등 서로 다른 프로토콜에서 데이터 전송을 위한 일관된 인터페이스를 만들 수 있습니다.
4.
게임 개발: 추상 팩토리 패턴을 사용하여, 서로 다른 플랫폼에서 동작할 수 있는 일관된 모양의 게임 객체를 생성할 수 있습니다. 예를 들어, Windows, Mac, Linux 등 서로 다른 플랫폼에서 동작할 수 있는 일관된 모양의 캐릭터, 아이템, 무기 등을 생성할 수 있습니다.

참고