Abstract Factory 추상 팩토리

고승원·2022년 10월 21일
0

Design Pattern

목록 보기
4/5
post-thumbnail

실제 객체가 정확히 무엇인지 알지 못해도 서로 관련성이 있거나 독립적인 여러 객체를 생성하고 조작할 수 있도록 해준다.

자주 사용하는 Iterator가 Abstract Factory패턴이 적용되었다.

사용처

  • 객체가 생성되거나 구성, 표현되는 방식과 무관하게 시스템을 독립적으로 만들 때
  • 여러 제품군 중 하나를 선택해서 시스템을 설정해야하고 한번 구성한 제품을 다른 것으로 대체할 때
  • 구체적인 클래스에 의존하고 싶지 않은 경우

장점

  • 팩토리에서 만들어진 제품이 서로 호환되는지 확인할 수 있다.
  • 구현체와 클라이언트 코드간 결합도를 낮춘다.
  • SRP
  • OCP

단점

  • 많은 인터페이스와 클래스가 생기기 때문에 코드가 복잡해진다.
  • 새로운 Product를 제공하기 어려울 수 있다.

구현

Abstract Product : Product 관련 인터페이스.

Concreate Product : Abstract Product의 구현 클래스.

Abstract Factory : 각각의 추상 제품을 생성하기 위한 메서드 선언

Concreate Factory : Abstract Factory에 있는 메서드를 구현한다. 각 Concreate Factory는 변형된 제품만 생성한다.

Note : Concreate Factory는 Abstract Product를 반환해야 한다. → 클라이언트가 특정 제품에 연결되지 않고, Concreate Product로 변형시킬 수 있기 때문.

코드

기본이 되는 팩토리가 재료를 공급하고 생산된 Product를 몰라도 Product의 인터페이스를 통해 조작한다.

Abstract Factory

interface Factory{
    Timber makeTimber();
    Pond makePond();
}

Abstract Product

interface Furniture{
    void createFurniture(Factory factory);
    void Delivery();
}

Concreate Factory, Concreate Product

public class Main{
    public static void main(String[] args) {
        // Concreate Factory
        Factory chairFactory = new ChairFactory();
        Factory sofaFactory = new SofaFactory();

        //Concreate Product
        Furniture modernChair = new MordernFurniture(); 
        modernChair.createFurniture(chairFactory);//모던 의자를 만든다.

        Furniture victorianSofa = new VictorianFurniture();
        victorianSofa.createFurniture(sofaFactory);//빅토리안 소파를 만든다.

ChairFactory는 의자를 만들기 위한 나무와 못을 제공한다.

SofaFactory는 소파를 만들기 위한 나무와 못을 제공한다.

createFurniture는 가구를 만든다.

Abstract Factory는 Factory method와 혼합하여 사용하기도 한다.

디자인 패턴을 너무 딱딱하게 생각하지 말고 원하는 부분은 변경하여 사용해도 된다.

ConcreateFactory는 싱글톤으로 만드는게 좋다.

profile
봄은 영어로 스프링

0개의 댓글