본문 바로가기

Programming/Design Patterns

GoF 디자인 패턴 - 추상 팩토리 패턴 (Abstract Factory Pattern)

반응형

1. 추상 팩토리 패턴이란?

추상 팩토리 패턴은 생성 패턴 (Creational Patterns)의 하나로써 관련된 객체들의 집합을 생성할 수 있도록 하는 패턴으로, 구체적인 클래스를 지정하지 않고도 객체를 생성할 수 있도록 한다. 특정 제품군에 속하는 객체들을 일관된 방식으로 생성하는 데 유용하다.

특징

  • 일관된 객체 생성: 동일한 제품군에 속하는 객체들을 일관된 방식으로 생성할 수 있다.
  • 구체적인 클래스의 의존성 제거: 클라이언트 코드에서 특정 구현 클래스를 직접 참조하지 않도록 할 수 있다.
  • 객체 생성의 확장성 향상: 새로운 제품군을 추가할 때 기존 코드 변경을 최소화할 수 있다.

2. 추상 팩토리 패턴의 구조

  1. AbstractFactory(추상 팩토리 인터페이스): 제품군을 생성하는 메서드를 선언한다.
  2. ConcreteFactory(구체적인 팩토리 클래스): 추상 팩토리를 구현하여 실제 제품을 생성한다.
  3. AbstractProduct(제품 인터페이스): 개별 제품을 위한 인터페이스를 정의한다.
  4. ConcreteProduct(구체적인 제품 클래스): 제품 인터페이스를 구현하여 실제 제품을 생성한다.
  5. Client(클라이언트): 팩토리를 사용하여 객체를 생성한다.

3. 추상 팩토리 패턴 구현 예제

예제 1 : 서로 다른 동물 생성

// 1. Abstract Product 인터페이스
interface Animal {
    void makeSound();
}

// 2. Concrete Product 클래스
class Dog implements Animal {
    public void makeSound() {
        System.out.println("멍멍!");
    }
}

class Cat implements Animal {
    public void makeSound() {
        System.out.println("야옹!");
    }
}

// 3. Abstract Factory 인터페이스
interface AnimalFactory {
    Animal createAnimal();
}

// 4. Concrete Factory 클래스
class DogFactory implements AnimalFactory {
    public Animal createAnimal() {
        return new Dog();
    }
}

class CatFactory implements AnimalFactory {
    public Animal createAnimal() {
        return new Cat();
    }
}

// 5. 클라이언트 코드
public class AbstractFactoryExample {
    public static void main(String[] args) {
        AnimalFactory factory = new DogFactory();
        Animal animal = factory.createAnimal();
        animal.makeSound();

        factory = new CatFactory();
        animal = factory.createAnimal();
        animal.makeSound();
    }
}

예제 2 : 웹 개발에서 데이터베이스 커넥션 객체 생성

// 1. Abstract Product 인터페이스
interface DatabaseConnection {
    void connect();
}

// 2. Concrete Product 클래스
class MySQLConnection implements DatabaseConnection {
    public void connect() {
        System.out.println("MySQL 데이터베이스에 연결됨");
    }
}

class PostgreSQLConnection implements DatabaseConnection {
    public void connect() {
        System.out.println("PostgreSQL 데이터베이스에 연결됨");
    }
}

// 3. Abstract Factory 인터페이스
interface DatabaseFactory {
    DatabaseConnection createConnection();
}

// 4. Concrete Factory 클래스
class MySQLFactory implements DatabaseFactory {
    public DatabaseConnection createConnection() {
        return new MySQLConnection();
    }
}

class PostgreSQLFactory implements DatabaseFactory {
    public DatabaseConnection createConnection() {
        return new PostgreSQLConnection();
    }
}

// 5. 클라이언트 코드
public class AbstractFactoryExample {
    public static void main(String[] args) {
        DatabaseFactory factory = new MySQLFactory();
        DatabaseConnection connection = factory.createConnection();
        connection.connect();

        factory = new PostgreSQLFactory();
        connection = factory.createConnection();
        connection.connect();
    }
}

4. 추상 팩토리 패턴의 장점과 단점

장점

  • 일관된 객체 생성: 제품군 전체를 통일된 방식으로 생성할 수 있다.
  • 클라이언트 코드 변경 최소화: 클라이언트는 특정 제품군을 직접 참조하지 않으므로 유지보수가 용이하다.
  • 유연한 확장성: 새로운 제품군이 추가될 경우, 기존 코드를 수정하지 않고 확장할 수 있다.

단점

  • 구현 복잡성 증가: 팩토리와 제품 인터페이스가 증가하여 코드가 복잡해질 수 있다.
  • 확장 시 모든 제품을 고려해야 함: 새로운 제품군이 추가될 때, 기존 인터페이스를 구현해야 하므로 부담이 될 수 있다.

5. 활용 사례

1) 데이터베이스 연결 관리

웹 애플리케이션에서 MySQL, PostgreSQL, MongoDB 등 다양한 데이터베이스를 지원할 때, 추상 팩토리를 사용하여 특정 데이터베이스에 맞는 커넥션 객체를 생성할 수 있다.

2) UI 컴포넌트 라이브러리

다양한 테마(예: 라이트 모드, 다크 모드)에 따라 적절한 UI 컴포넌트(Button, Checkbox 등)를 동적으로 생성할 때 활용할 수 있다.

3) 클라우드 서비스 API 통합

AWS, Google Cloud, Azure 등 여러 클라우드 서비스와 연동하는 애플리케이션에서, 특정 클라우드 환경에 맞는 API 클라이언트를 팩토리를 통해 제공할 수 있다.

4) 동물 캐릭터 생성

게임에서 서로 다른 동물 캐릭터를 동적으로 생성할 때 유용하게 사용된다.

 


추상 팩토리 패턴은 관련된 객체들을 일관된 방식으로 생성하는 데 유용한 패턴으로, 다양한 제품군을 지원해야 하는 환경에서 강력한 장점을 제공한다. 그러나 클래스 수가 증가하고 설계가 복잡해질 수 있으므로, 필요에 맞게 적절히 활용하는 것이 중요하다.

 

반응형