추상 팩토리 패턴이란?
추상 팩토리 패턴은 생성 패턴의 한 종류로 객체의 집합을 생성할 때 유리한 패턴입니다.
추상 팩토리 패턴은 앞에서 소개한 팩토리 메서드 패턴하고는 다를 패턴입니다. 추상 팩토리 패턴은 기존 팩토리 패턴에서 한번 더 추상화시켜서 서로 관련이 있는 제품을 생성하게 해 줍니다.
즉 구상 클래스들을 지정하지 않고도 객체의 모음을 생성할 수 있습니다.
왜 Factory Pattern이 나오게 된 걸까?
이러한 객체들을 프로그램 내에서 모든 UI를 각자 다른 객체로 만들게 되면 나중에 수정이 어려울 수 있기 때문에 이러한 객체들을 표현하는 하나의 추상 클래스를 정의하여 이를 해결하기 위한 방법으로 만들어졌습니다.
추상 팩토리 메서드 패턴은 주로 어떤 경우에 사용할까?
생성을 책임지는 구체적인 클래스를 분리시키고 싶을 때 사용합니다
이름에 추상이 들어간다는 것은 캡슐화한다라고 생각하시면 됩니다. 그 뜻은 인스턴스를 추상화하는 것입니다. 이러면 위에서 말한 생성에 관한 구체적인 내용이 사용자와 분리됩니다.
주로 사용하는 경우는 여러 제품을 선택을 통하여 시스템을 구성하고 제품군을 대처하고 싶을 때입니다.
추상 팩토리는 필요한 모든 것을 생성하기 때문에 전체 제품군은 한 번에 변경이 가능합니다.
팩토리 메서드 패턴 VS 추상화 팩토리 메서드 패턴
팩토리 대신 추상화 팩토리를 사용하는 경우는?
- 제품군중 하나를 선택해서 시스템을 설정해야 하고 구성한 제품군을 다른 것으로 대체할 수 있을 때
- 연관된 다수의 인스턴스가 함께 설계되거나 외부로부터 무언가를 제약하고 싶을 경우
조금 쉽게 설명하면 연관이 있는 객체를 묶어서 생성하는 경우에 추상화 팩토리 패턴이 팩토리 메서드 패턴에 비해서 유리합니다.
(하지만 저는 인스턴스를 굳이 숨길 필요 없는 코드에는 조금 더 간단한 팩토리 메서드 패턴을 사용하는 것이 좋다고 생각합니다.)
추상 팩토리 메서드 패턴 구조 이해해 보기!
Avstract Factory = AvstractFactoryMethod(맨 위에 있는 것) = Facroty 추상화 타입
Concrete Factory = iPhoneFactory, iPadFactory = 각 연관이 있는 인스턴스 집합을 생성할 Factory 타입
Abstract Product = CButton, CLabel = 생성됨 인스턴스를 추상화한 타입
Concrete Product = iPhoneButton, iPadLabel, iPadButton, iPhoneLabel = 최종적으로 생성되는 구체적인 타입
추상 팩토리 메서드 패턴의 장단점
장점
- 팩토리에서 생성되는 제품의 상호 호환을 보장할 수 있다.
- 단일 책임 원칙이기 때문에 코드를 쉽게 유지보수 할 수 있습니다
- 나머지는 팩토리 메서드와 동일한 장점입니다
단점
- 단점 역시 팩토리 메서드와 동일한 단점입니다
추상 팩토리 메서드 예제 코드
https://github.com/jjunhaa0211/ADPattern-Swift/tree/main/GoF-AbstractFactoryMethodPattern
GitHub - jjunhaa0211/ADPattern-Swift: 🧪 Swift를 사용하여 아키텍쳐 패턴과 디자인 패턴의 예제를 설명합
🧪 Swift를 사용하여 아키텍쳐 패턴과 디자인 패턴의 예제를 설명합니다. 🧪. Contribute to jjunhaa0211/ADPattern-Swift development by creating an account on GitHub.
github.com
느낀 점 및 오류
오늘은 쉽게 푸는 것이 너무 어려웠습니다... 그래서 설명도 미흠 했고 그나마 코드를 보시면 이해는 되실 텐데 자료도 해외를 위주로 봐서
오늘의 블로그는 조금 후회만 남습니다. 빠른 시일 내에 수정해서 조금이라도 더 도움이 되는 블로그가 되도록 노력하겠습니다.
'Swift > 패턴' 카테고리의 다른 글
[구조 패턴] Bridge Pattern (1) | 2023.02.28 |
---|---|
[생성 패턴] Singleton Pattern (0) | 2023.02.28 |
[생성 패턴]Factory Method Pattern (0) | 2023.02.28 |
[생성 패턴] Prototype Pattern (0) | 2023.02.28 |
[생성 패턴] Builder Pattern (0) | 2023.02.27 |