Abstract Factory Pattern

Eddy📱·2022년 7월 21일
0

Design-Pattern

목록 보기
4/4
post-thumbnail

추상 팩토리 패턴에 대해 알아보도록 하자!

추상 팩토리 패턴이란?

  • 구체적인 클래스를 지정하지 않고 관련된 객체를 모으기 위한 인터페이스를 제공
  • 코드를 변경하지 않고 조건에 따라 적절한 객체를 사용할 수 있게 한다
  • 동일하게 사용하는 Button, Label 같은 UI가 다른 모양, 다른 동작하는 것을 추상 클래스로 해결

이렇게 말해서는 정확히 알기 어렵다

하지만 추상이라는 의미에서 유추가능하듯이 프로토콜을 사용해서 추상화를 시키는 것같다고 먼저 의미를 예측할 수 있다.

장단점은 아래와 같다

장점

  • 런타임에 사용하는 코드를 변경하지 않고도 구체적인 구현 변경 가능
  • 단일 책임 원칙
  • 개방/폐쇄 원칙

구체적은 구현을 만들어서 하기 때문에 변경없이 바로 사용할 수 있다.

또한 아래 예시를 보면 이해할 수 있듯이, 단일 책임 원칙을 준수하고 있으며 개방/폐쇄 원칙도 준수하고 있다.

단점

  • 복잡성과 추가작업 발생(새로운 종류가 추가되면 Factory에도 추가 필요)

하지만 새로운 종류가 생기게 된다면 Factory라는 새 객체를 만들어서 프로토콜을 채택해서 구현해줘야 하는 번거로움이 존재한다.

사용하는 상황

  • 생성을 책임지는 구체적인 클래스를 분리시키고 싶을 때
    • 인스턴스 생성하는 과정을 캡슐화 한 것
    • 사용자와 생성에 대한 구체적인 내용을 분리해야할 때
  • 연관되어 있는 다수의 인스턴스가 함께 사용하도록 설계하고 이 부분에 대한 제약이 외부에서도 지켜지도록 하고 싶을 때

Factory Pattern vs Abstract Factory Pattern

둘은 비슷하면서 조금의 차이가 존재한다.

Factroy Pattern는 Method로 각각 다른 종류를 생성한다. 그래서 메서드 내부에 Switch를 통해 어떤 객체인지 구분을 한다.

그래서 추가하게되면 이 Switch문에 대한 수정이 필요해진다.

하지만, Abstract Factory는 조금 다르다.

객체를 생성해서 Factory 객체에서 추상 팩토리를 채택해서 구현하게 된다.

그리고 그 팩토리에는 자신과 관련된 여러개의 객체들을 묶어서 사용한다.

이 부분에서 둘 간의 차이가 존재하며 Factory Pattern의 보완점으로 Abstract Pattern이 나오게 되었다.

이제 개념은 그만보고 코드로 이해해보면 좋을 것 같다.

Code 예시

실제 코드에서 어떻게 사용하는 지 봐보도록 하자!
그전에 먼저 코드의 예시를 그림으로 그린 것을 보고 이해해보는게 좋을 것 같다

Button, Label 프로토콜이 존재하고 Button, Label를 사용하는 각각 다른 운영체제의 버튼과 라벨에서 이를 채택해서 내부 구현을 해준다.

그리고 이 추상팩토리는 추상화할 수 있는 가장 큰 팩토리의 프로토콜이 존재한다.

이를 채택해서 아까 말했던 팩토리 객체를 만드는 것이다.

큰 그림에서 보게되면 추상 팩토리를 채택한 각각 운영체제의 팩토리가 존재하고 이곳에서는 필요한 운영체제 버튼, 라벨을 사용하고 있다.

이것이 하나의 객체에 여러 종류의 필요한 것들이 묶어서 존재한다는 의미가 여기에서 나온것이다!

이제 진짜 코드를 보도록 하자

먼저 추상화하는 요소들을 선언해준다.

그 다음 각각 운영체제에서 프로토콜들을 채택해서 내부 구현을 해주면 된다.

WindowViewFactory에서 보면 알겠지만, WindowButton, WindowLabel를 반환값으로 하는 메서드를 가지고 있다.

이것으로 하나로 묶여져 있는 것을 파악할 수 있다.

위의 예시는 동일하므로 생략하도록 한다

이제 사용처에서 원하는 Factory를 생성하고 그곳에서 메서드를 호출한다. 메서드의 이름은 보았듯이 프로토콜에서 채택했으므로 다른 Factory에서도 동일한 네이밍을 사용하여 호출할 것이다.

출력된 것을 보면 위와 같다.

이제 마지막으로 현재 내가 사용하는 운영체제를 호출하는 방법에 대해 알아보려고 한다.

조건문을 통해 운영체제에 따라 다른 Factory를 반환하게 되고 그에 따른 버튼과 라벨을 출력하는 것을 볼 수 있다.

이상으로 Abstract Factory Pattern에 대해 알아보았다!

Factory Pattern 이랑 유사한점도 많아서 처음에는 헷갈렸지만 명확한 차이가 존재하는 것 같다!

참고사이트

https://beomseok95.tistory.com/246

https://stackoverflow.com/questions/5739611/what-are-the-differences-between-abstract-factory-and-factory-design-patterns

https://icksw.tistory.com/235

https://yagom.net/courses/design-pattern-in-swift/lessons/생성-패턴/topic/abstract-factory-method/

profile
Make a better world

0개의 댓글