백엔드/Java

자바 추상 팩토리 (Abstract factory) 패턴

dami97 2023. 5. 13. 23:43
반응형

팩토리 메서드 패턴과 추상 팩토리 패턴 차이점

 

추상 팩토리(Abstract factory) 패턴이란?

  • 관련있는 여러 객체를 만들어주는 추상화된 형태로 정의한 인터페이스
  • 팩토리 메서드 패턴과 굉장히 흡사하지만 팩토리를 사용하는 클라이언트가 추가된 패턴

예제 코드

이전 팩토리 메서드에서 Soju 클래스에 Design 클래스가 추가되었다고 가정한다면

public class Soju {

    private String name;
    private Design design;

    public Design getAddress() {
        return design;
    }

    public void setAddress(Design design) {
        this.design = design;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

//아래 코드는 클라이언트 코드에 해당됨
public class GoodDaySojuFactory implements SojuFactory {

    @Override
    public Soju createSoju() {
        GoodDaySoju goodDaySoju = new GoodDaySoju();
        goodDaySoju.setDesign(new Design());
        return goodDaySoju;
    }
}

클라이언트 코드가 구체적인 클래스에 의존하고 있는것을 볼수있다.

Design을 만들어주는 추상 팩토리 인터페이스 정의

public interface SojuDesignFactory {

    Design createDesign();
}

public interface Design {} // 기존 클래스를 인터페이스로 변경

추상 팩토리의 구체적인 팩토리 정의

public class GoodDaySojuDesignFactory implements SojuDesignFactory {
    @Override
    public Design createDesign() {
        return new GoodDayDesign();
    }
}

public class GoodDayDesign implements Design {}

추상 팩토리를 사용하도록 클라이언트 코드를 수정

public class GoodDaySojuFactory implements SojuFactory {

    private SojuDesignFactory sojuDesignFactory;

    public GoodDaySojuFactory(SojuDesignFactory sojuDesignFactory) {
        this.sojuDesignFactory = sojuDesignFactory;
    }

    @Override
    public Soju createSoju() {
        GoodDaySoju goodDaySoju = new GoodDaySoju();
        goodDaySoju.setDesign(sojuDesignFactory.createDesign());
        return goodDaySoju;
    }
}

위 코드는 이제 디자인이 변경되더라도 코드가 바뀔 일이 없다.

한정판 디자인이 생겼다고 가정

public class GoodDayDesignEdition implements Design{ } // 한정판 디자인 클래스 생성

//GoodDayDesignEdition 객체를 생성하는 팩토리 작성
public class GoodDaySojuDesignEditionFactory implements SojuDesignFactory {
    @Override
    public Design createDesign() {
        return new GoodDayDesignEdition();
    }
}

사용 코드

public static void main(String[] args) {

  SojuFactory sojuFactory = new GoodDaySojuFactory(new GoodDaySojuDesignEditionFactory()); // GoodDaySojuDesignEditionFactory
  Soju goodDayDesignEdition = sojuFactory.orderSoju();
  System.out.println(goodDayDesignEdition.getDesign().getClass() + " ," + goodDayDesignEdition.getName()); // class GoodDayDesignEdition ,GoodDay

  SojuFactory sojuFactory2 = new GoodDaySojuFactory(new GoodDaySojuDesignFactory()); // GoodDaySojuDesignFactory
  Soju goodDayDesign = sojuFactory2.orderSoju();
  System.out.println(goodDayDesign.getDesign().getClass() + " ," + goodDayDesign.getName()); // class GoodDayDesign ,GoodDay
}

밖에서 어떤 팩토리를 넣어주냐에 따라 Soju 객체가 달라지지만 핵심 코드는 변경되지 않음을 알 수 있다.

요약 정리

  • 팩토리 메서드패턴은 객체 생성의 관점 즉 팩토리를 구현하는 방법에 좀 더 집중되어있고, 추상 팩토리 패턴은 그러한 팩토리를 사용하는 관점에 좀 더 집중되어있다.
  • 팩토리 메서드 패턴은 구체적인 객체 생성 과정을 구체적인 구현 클래스로 옮기는 것
  • 추상 팩토리 패턴은 객체에 관련있는 다른 여러 객체를 구체적인 클래스에 의존하지 않고 만들 수 있게 해주는 것
반응형