반응형
1. 추상 팩토리 패턴이란?
추상 팩토리 패턴은 생성 패턴 (Creational Patterns)의 하나로써 관련된 객체들의 집합을 생성할 수 있도록 하는 패턴으로, 구체적인 클래스를 지정하지 않고도 객체를 생성할 수 있도록 한다. 특정 제품군에 속하는 객체들을 일관된 방식으로 생성하는 데 유용하다.
특징
- 일관된 객체 생성: 동일한 제품군에 속하는 객체들을 일관된 방식으로 생성할 수 있다.
- 구체적인 클래스의 의존성 제거: 클라이언트 코드에서 특정 구현 클래스를 직접 참조하지 않도록 할 수 있다.
- 객체 생성의 확장성 향상: 새로운 제품군을 추가할 때 기존 코드 변경을 최소화할 수 있다.
2. 추상 팩토리 패턴의 구조
- AbstractFactory(추상 팩토리 인터페이스): 제품군을 생성하는 메서드를 선언한다.
- ConcreteFactory(구체적인 팩토리 클래스): 추상 팩토리를 구현하여 실제 제품을 생성한다.
- AbstractProduct(제품 인터페이스): 개별 제품을 위한 인터페이스를 정의한다.
- ConcreteProduct(구체적인 제품 클래스): 제품 인터페이스를 구현하여 실제 제품을 생성한다.
- 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) 동물 캐릭터 생성
게임에서 서로 다른 동물 캐릭터를 동적으로 생성할 때 유용하게 사용된다.
추상 팩토리 패턴은 관련된 객체들을 일관된 방식으로 생성하는 데 유용한 패턴으로, 다양한 제품군을 지원해야 하는 환경에서 강력한 장점을 제공한다. 그러나 클래스 수가 증가하고 설계가 복잡해질 수 있으므로, 필요에 맞게 적절히 활용하는 것이 중요하다.
반응형
'Programming > Design Patterns' 카테고리의 다른 글
GoF 디자인 패턴 - 어댑터 패턴 (Adapter Pattern) (1) | 2025.04.18 |
---|---|
GoF 디자인 패턴 - 프로토타입 패턴 (Prototype Pattern) (0) | 2025.04.10 |
GoF 디자인 패턴 - 빌더 패턴 (Builder Pattern) (0) | 2025.04.09 |
GoF 디자인 패턴 - 팩토리 메서드 패턴 (Factory Method Pattern) (1) | 2025.04.08 |
GoF 디자인 패턴 - 싱글톤 패턴 (Singleton Pattern) (0) | 2025.04.08 |