본문 바로가기

Design/Design Pattern

[Design Pattern] Factory Method Pattern

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


이번 팩토리 메서드 패턴은 "데이터 베이스" 클라이언트를 생성하고 데이터를 Insert하는 과정을 접목시켜 알아보겠다.

팩토리 메서드 패턴이란?

부모 클래스에 알려지지 않은 구체 클래스를 생성하는 패턴이며 자식 클래스가 어떤 객체를 생성할지를 결정하도록 캡슐화한 패턴이다.
이전에 살펴보았던 템플릿 메서드 (링크)의 생성 패턴 버전으로 볼 수 있다.

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

  • Product: 생성될 객체들이 구현해야 할 기능을 명시한 인터페이스.
  • ConcreteProduct: 객체가 생성되는 클래스.
  • ConcreteCreator: 팩토리 메서드를 구현하고 있으며 ConcreteProduct를 생성하는 클래스.
  • Creator: 팩토리 메서드를 구현하기 위한 기능을 명시한 추상 클래스.

위의 설명을 "데이터 베이스" 클라이언트 생성에 접목시켜본다.

  • User DB 클라이언트를 생성할 사용자 클래스.
  • DBClient: DB 클라이언트들이 구현해야 할 기능을 명시한 인터페이스.
  • RedisClient: DB 클라이언트를 구현하고 있으며 Redis에 접속하고 데이터를 CRUD하는 역할을 한다.
  • MariaClient: DB 클라이언트를 구현하고 있으며 MariaDB에 접속하고 데이터를 CRUD하는 역할을 한다.
  • DBClientFactory: 팩토리 메서드를 구현하기 위한 메소드를 정의한 추상 클래스.
  • DefaultDBClientFactory: 펙토리 메서드를 구현하고 있으며 실제로 DB 클라이언트를 객체화 하는 클래스.

코드를 보면서 하나씩 살펴보도록 한다.

DBClient Interface
DB 클라이언트들이 구현해야하는 기능을 정의하고 있다.

MariaClient, RedisClient
DBClient를 구현하고 있으며 각각 DB에 연결하고 데이터를 다루는 메서드를 구현하고 있다.

DBClientFactory
팩토리 메서드를 구현하는 클래스가 구현해야하는 팩토리 메서드(createDBClient)를 정의하고 있다.
DB의 종류(DatabaseType)을 enum으로 가지고 있다.
외부에 노출되는 create 메서드는 실제 객체 생성을 자신을 구현한 자식 클래스에게 위임하기 위하여 createDBClient()를 호출하게 되어있다.

DefaultDBClientFactory
팩토리 메서드를 구현한 클래스로 입력받은 DatabaseType에 따라 적절한 DBClient를 생성하고 있다.
init 메서드를 통해 DBClient들이 DB에 접속할 수 있도록 하고있다.

User
실제로 DBClient를 사용하는 클래스.
팩토리 메서드를 구현한 클래스의 create 메서드를 호출하면서 DatabaseType을 전달하였고 원하는 DBClient를 사용할 수 있게되었다.

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


지금까지 팩토리 메서드 패턴을 DB클라이언트를 생성하고 데이터를 삽입하는 과정에 비유하여 알아보았다.

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

[Design Pattern] Prototype Pattern  (0) 2022.02.01
[Design Pattern] Singleton Pattern  (0) 2022.02.01
[Design Pattern] Template Method Pattern  (0) 2022.01.28
[Design Pattern] Adapter Pattern  (0) 2022.01.28
[Design Pattern] Strategy Pattern  (0) 2022.01.26