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

1.1 개요

프로그래밍하다 보면 특정 목적에 따라 사용해야 하는 개체들이 서로 호환성이 있어야 하는 경우가 발생합니다. 목적에 따라 사용해야 하는 개체군들이 있을 때 특정 목적에 맞게 호환성 있는 개체가 무엇인지 조사하고 사용하기 위해서 비용이 발생할 수 있습니다. 이럴 때 추상 팩토리 패턴을 사용하면 효과적으로 비용을 줄일 수 있을 것입니다. 특히, 비슷한 작업을 위해 필요한 개체들 사이에 호환성을 유지해야 하는 여러 종류의 개체군이 있을 때 추상 팩토리 패턴을 사용하면 표준화된 방식에 의해 자신에게 맞는 개체군을 효과적으로 사용할 수 있게 해 줍니다.

이를 위해 추상 팩토리 패턴에서는 서로 호환성 있는 개체들을 생성하는 부분만 담당하는 개체를 제공하는 것입니다. 이처럼 호환성 있는 개체를 생성하는 개체를 팩토리 개체라 부릅니다. 하나의 팩토리 개체를 통해 생성되는 개체들은 상호 호환성을 보장받기 때문에 사용자는 호환성에 대해 고민을 할 필요가 없게 됩니다.

팩토리 형식에서는 호환성 있는 개체를 생성하는 메서드를 표준화된 인터페이스에 약속합니다. 이를 위해서 팩토리 개체를 통해 생성되는 개체들도 일반화합니다. 이로써 사용자는 자신이 사용해야 할 목적과 환경에 맞는 팩토리 개체가 무엇인지만 판단하면 됩니다. 그리고 팩토리 개체를 통해 생성되는 개체 형식도 일반화하였기 때문에 사용 방법은 같아집니다. 결국, 사용자는 사용 목적이나 환경이 바뀌어 다른 개체군을 선택하여도 단순히 팩토리 개체만 교체하면 되기 때문에 유지보수 비용이 줄어들게 됩니다.

 “호환성 있는 개체를 생성하는 메서드를 표준화된 인터페이스에 약속”

1. 2 시나리오

EHWorld에는 Everyday 카메라와 Holiday 카메라가 있습니다. 두 종류의 카메라 모두 렌즈 교환식 카메라입니다. 저는 사람이나 건물 등을 촬영할 때에는 부드럽게 표현해 주는 Everyday 카메라를 선호합니다. 그리고 여행에서 아름다운 풍경을 찍을 때에는 자연스럽게 표현해 주는 Holiday 카메라를 선호합니다. 그런데 저에게는 고민이 하나 있습니다. 사진에 취미를 갖고 렌즈를 하나하나 구매하다 보니 여행을 갈 때마다 Holiday 카메라와 호환되는 렌즈를 찾는데 너무 많은 시간이 듭니다. 물론, Everyday 카메라와 호환되는 렌즈를 찾을 때도 너무 많은 시간이 소요되네요.

어떻게 하면 제 고민을 해결할 수 있을까요?

어느 날 저의 아내가 저에게 선물을 가지고 왔습니다. 두 개의 라면 박스였습니다. 저는 순간 짜증이 밀려왔지만, 아내의 말을 듣고 나니 짜증은 고마움과 기쁨으로 전이되었습니다.

“E 라면 박스에는 Everyday 렌즈들을 넣고 H 라면 박스에는 Holiday 렌즈들을 넣으면 좋지 않을까?”

예전보다 렌즈를 찾는데 드는 비용은 줄어들었습니다. 하지만 여전히 많은 시간을 소요해야 원하는 렌즈를 찾을 수 있었습니다. 봄에 꽃을 찍을 때에는 10 mm 단 렌즈를 사용하면 한 송이를 클로즈업 할 수 있어 봄의 기운을 전달할 수 있습니다. 강 건너 풍경을 찍을 때는 줌 렌즈를 사용해야 원하는 피사체를 효과적으로 표현할 수 있고요. 사랑하는 아들을 찍을 때에는 35 mm 단 렌즈를 선호하고 영원한 동반자인 사랑하는 나의 아내를 찍을 때에는 45 mm 단 렌즈를 선호합니다. 그리고 제가 강의했던 학생들이 교육 과정을 마치고 나면 수료식을 수행합니다. 이때는 70 mm 단 렌즈를 사용하곤 합니다. 가끔 아들이나 아내가 저의 카메라와 렌즈를 사용할 일이 있게 되면 어떠한 렌즈를 사용하는 것이 좋은지를 몰라서 대충 골라 가곤 합니다. 그리고는 촬영된 사진이 이상하다고 투덜대곤 합니다.

어떻게 하면 우리 가족의 고민을 해결할 수 있을까요?

이 문제를 해결하기 위해 라면 박스 안에 칸막이를 만들었습니다. 3 X 3 형태로 만들어 우측부터 단 렌즈, 표준 렌즈, 줌 렌즈를 배치했습니다. 그리고 앞에는 가까운 피사체를 찍을 수 있는 렌즈를 배치하고 맨 뒤에는 먼 곳에 있는 피사체를 찍을 수 있는 렌즈를 배치하였습니다. 그리고 박스 앞에 종류별로 카메라를 배치할 수 있는 공간을 별도로 만들었습니다.

그 후로 우리 가족은 렌즈를 찾는 비용을 줄일 수 있게 되었고 아내와 아들도 자신들이 찍은 사진에 만족해합니다. 그런데 이제 아내와 아들이 저와 같이 여행을 가면 서로 자신이 사진을 찍어야 한다고 승강이를 벌이는 행복한 고민에 빠졌습니다.