본문 바로가기

디자인 패턴/생성 패턴

[생성 패턴] 추상 팩토리 (Abstract Factory)

728x90

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

추상 팩토리 패턴생성 디자인 패턴(Creational Design Pattern) 중 하나로, 관련된 객체들의 가족(family)을 생성하는 데 사용됩니다.
이 패턴은 객체 생성 코드를 캡슐화하고, 구체적인 클래스에 의존하지 않도록 설계하는 데 초점이 맞춰져 있습니다.

 

 

추상 팩토리 패턴 특징

  1. 관련 객체 생성: 서로 관련된 객체를 묶어서 생성하는 데 적합함
  2. 구체 클래스 의존 제거: 인터페이스나 추상 클래스를 사용하여 객체를 생성함으로써 코드의 유연성과 확장성 높임
  3. 객체군(Family of objects) 생성: 동일한 제품군의 객체들을 일관성 있게 생성
  4. 확장성: 새로운 객체군을 추가할 때 기존 코드를 수정하지 않고 확장이 가능

 

추상 팩토리 패턴 구조

  1. 추상 팩토리(Abstract Factory): 객체 생성 메서드의 집합을 정의하는 인터페이스
  2. 구체 팩토리(Concrete Factory): 추상 팩토리를 구현하여 실제 객체를 생성
  3. 추상 제품(Abstract Product): 생성될 객체의 인터페이스
  4. 구체 제품(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