728x90
추상 팩토리 패턴(Abstract Factory Pattern)
추상 팩토리 패턴은 생성 디자인 패턴(Creational Design Pattern) 중 하나로, 관련된 객체들의 가족(family)을 생성하는 데 사용됩니다.
이 패턴은 객체 생성 코드를 캡슐화하고, 구체적인 클래스에 의존하지 않도록 설계하는 데 초점이 맞춰져 있습니다.
추상 팩토리 패턴 특징
- 관련 객체 생성: 서로 관련된 객체를 묶어서 생성하는 데 적합함
- 구체 클래스 의존 제거: 인터페이스나 추상 클래스를 사용하여 객체를 생성함으로써 코드의 유연성과 확장성 높임
- 객체군(Family of objects) 생성: 동일한 제품군의 객체들을 일관성 있게 생성
- 확장성: 새로운 객체군을 추가할 때 기존 코드를 수정하지 않고 확장이 가능
추상 팩토리 패턴 구조
- 추상 팩토리(Abstract Factory): 객체 생성 메서드의 집합을 정의하는 인터페이스
- 구체 팩토리(Concrete Factory): 추상 팩토리를 구현하여 실제 객체를 생성
- 추상 제품(Abstract Product): 생성될 객체의 인터페이스
- 구체 제품(Concrete Product): 추상 제품의 구현체로, 구체 팩토리를 통해 생성
추상 팩토리 패턴 유스케이스: 가구 공장 시스템
목표: 가구를 만드는 공장을 운영하는 시스템을 구현한다고 가정해 보겠습니다. 이 공장에는 다양한 스타일의 가구가 있고, 각 스타일은 서로 다른 종류의 가구를 만듭니다. 예를 들어, 현대적인 스타일의 가구, 고전적인 스타일의 가구 등을 만들 수 있습니다. 각 가구는 의자, 테이블 등의 종류가 있습니다.
클래스 다이어그램
- AbstractFactory: 가구 제품들을 만드는 추상 팩토리 인터페이스 (ex. ModernFurnitureFactory, ClassicFurnitureFactory).
- ConcreteFactory: 구체적인 가구 공장 클래스 (ex. ModernFurnitureFactory는 현대식 가구를 만들고, ClassicFurnitureFactory는 고전식 가구를 만듬).
- AbstractProduct: 가구의 제품군을 추상화 (ex. Chair, Table).
- ConcreteProduct: 구체적인 가구 제품 (ex. ModernChair, ModernTable, ClassicChair, ClassicTable).
- Client: 고객은 추상 팩토리를 이용해서 가구를 생성하고 사용할 수 있습니다.
1. 추상 제품
public interface Chair {
void render();
}
public interface Table {
void render();
}
2. 구체 제품
public class ClassicChair implements Chair{
@Override
public void render() {
System.out.println("ClassicChair");
}
}
public class ModernChair implements Chair{
@Override
public void render() {
System.out.println("ModernChair");
}
}
public class ClassicTable implements Table{
@Override
public void render() {
System.out.println("ClassicTable");
}
}
public class ModernTable implements Table{
@Override
public void render() {
System.out.println("ModernTable");
}
}
3. 추상 팩토리
public interface FurnitureFactory {
Chair createChair();
Table createTable();
}
4. 구체 팩토리
public class ClassicFurnitureFactory implements FurnitureFactory{
@Override
public Chair createChair() {
return new ClassicChair();
}
@Override
public Table createTable() {
return new ClassicTable();
}
}
public class ModernFurnitureFactory implements FurnitureFactory{
@Override
public Chair createChair() {
return new ModernChair();
}
@Override
public Table createTable() {
return new ModernTable();
}
}
5. 클라이언트
public class Client {
Chair chair;
Table table;
public Client(FurnitureFactory factory) {
this.chair = factory.createChair();
this.table = factory.createTable();
}
public void render() {
chair.render();
table.render();
}
}
6. Main
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws IOException {
String cmd = br.readLine();
FurnitureFactory factory;
if (cmd.contains("클래식")) {
factory = new ClassicFurnitureFactory();
} else if (cmd.contains("모던")){
factory = new ModernFurnitureFactory();
} else {
System.out.println("해당 제품은 존재하지 않습니다.");
return;
}
Client client = new Client(factory);
client.render();
}
}
728x90
'디자인 패턴 > 생성 패턴' 카테고리의 다른 글
[생성 패턴] 빌더 패턴 (Builder Pattern) (0) | 2025.01.27 |
---|---|
[생성 패턴] 싱글톤(Singleton Pattern) Java 예제 (5) | 2024.10.14 |