본문 바로가기

Design/Design Pattern

[Design Pattern] Abstract Factory Pattern

이번 장에서는 추상 팩토리(Abstract Factory) 패턴에 대해서 알아보도록 한다.
샘플 코드는 여기 (링크) 프로젝트의 테스트 코드로 정리해두었다.


추상 팩토리 패턴이란?
다양한 구성 요소 별로 '객체의 집합'을 생성하는 디자인 패턴.
서로 관련된 객체들을 하나로 묶어서 팩토리 클래스로 만들고 조건에 맞게 생성하도록 팩토리를 만들어서 객체를 생성하는 디자인 패턴.

대학생이 들어야하는 전공수업을 예시로 알아보도록 하겠다.
대학생을 학생들마다 학과를 가지고 있으며 학과에 따라서 학년에 맞는 전공수업이 정해져있다.
이는 대학생이 임의로 정할 수 없으며 학교에서 정한 규칙을 따라야한다.

추상 팩토리 패턴이란 서로 관련된 객체들을 하나로 묶는다고 하였는데 대학생과 전공수업을 하나로 묶어서
한명의 대학생을 생성할 때 관련된 전공수업이 동시에 생성된다고 생각하면 쉽게 이해가 될 것이다.
혹시 이해가 되지 않더라도 Class Diagram과 코드를 통해서 다시 살펴 볼 예정이니 걱정하지 않아도 된다.

GoF Design Patterns에 따르면 아래와 같은 Class Diagram이 그려진다.

추상 팩토리(AbstractFactory)가 있고 이를 구현한 ConcreteFactory1과 ConcreteFactory2가 있다.
ConcreteFactory1은 ProductA1과 ProductA2를 생성한다.
ConcreteFactory2는 ProductB1과 ProductB2를 생성한다.

위의 그림을 대학생과 전공수업으로 바꿔보면 아래와 같은 그림이 그려진다.

추상 팩토리(StudentFactory)가 있고 이를 구현한 ChemistryStudentFactory와 ComputerStudentFactory가 있다.
ChemistryStudentFactory는 ChemistryStudent만을 생성하며
ComputerStudentFactory는 ComputerStudent만을 생성한다.


코드를 보면서 하나씩 살펴보도록 한다.
실제 코드에는 ChemistryStudent와 ComputerStudent가 있지만 둘의 차이가 대동소이 하므로 ComputerStudent 관련 코드만 살펴보도록 한다.
혹시 모든 코드가 궁금하다면 여기 (링크)를 확인하도록 한다.

MajorLecture Interface
전공 수업이 구현해야하는 메서드를 정의한 인터페이스

ComputerGrade1stMajorLecture, ComputerGrade2ndMajorLecture Class
MajorLecture를 구현하고 있으며 컴퓨터 공학 1학년과 2학년 전공 수업을 정의한 클래스

Student Class
학생들의 추상 클래스

ComputerStudent Class
Student Class를 확장(상속)한 클래스, 이번 예시에서는 비어있다.

StudentFactory Interface
학생 팩토리가 구현해야하는 메서드를 정의한 인터페이스

ComputerStudentFactory Class
ComputerStudent를 생성할 팩토리 클래스.
ComputerStudent를 생성하고 그에 맞는 전공을 입력한다.

University Class
Factory를 생성하고 Factory를 통해서 Student를 생성하는 클래스

코드를 실행한 결과는 아래와 같다.

추상 팩토리를 통해서 학생을 생성했을 뿐인데 학생의 전공에 맞는 전공수업이 자동으로 생성되어 있는 것을 확인할 수 있다.

만약 학생 임의로 선택이 가능한 교양수업이 추가된다면 어떻게 해야할까?
교양수업은 학생 임의로 선택이 가능하기 때문에 추상 팩토리 패턴과는 맞지않는다.
팩토리 메서드 패턴으로 교양수업을 생성하도록 해야한다.


지금까지 추상 팩토리 패턴을 대학생과 전공수업이 선택되는 과정을 통해서 알아보았다.

'Design > Design Pattern' 카테고리의 다른 글

[Design Pattern] Composite Pattern  (0) 2022.02.02
[Design Pattern] Bridge Pattern  (0) 2022.02.02
[Design Pattern] Builder Pattern  (0) 2022.02.01
[Design Pattern] Prototype Pattern  (0) 2022.02.01
[Design Pattern] Singleton Pattern  (0) 2022.02.01