ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [디자인패턴] 추상 팩토리 패턴 (Abstract Factory)
    카테고리 없음 2021. 11. 22. 18:12

     

    추상 팩토리 패턴 (Abstract Factory)

    서로 관련이 있는 객체들을 묶어 팩토리 클래스로 만들고, 이들 팩토리를 조건에 따라 생성하도록 다시 팩토리를 만들어 객체를 생성하는 패턴. 

    관련이 있는 카테고리별로 추상 클래스를 생성해서 객체를 구현하는 클래스들을 손쉽게 생성할 수 있도록 한다.

     

     

    장점

    연관성이 있는 여러 종류의 객체 생성에 유용하다.

    서브 클래스 생성을 최소화하기 위한 방법.

    1. 객체가 생성되는 방식 혹은 과정과 책임을 사용자가 모르도록 한다.

    2. 제품군간 교체가 쉽다.

    3. 제품군들이 실수로 섞여 사용되는 것을 방지한다.

     

     

    예시

    #pragma once
    #include <stdio.h>
    #include <iostream>
    
    using namespace std;
    
    // 추상 클래스
    class IDao {
    public:
    // 추상 메서드
    virtual string getData() = 0;
    };
    
    // 추상 팩토리 클래스
    class IFactory {
    public:
    // 추상 메서드 (IDao 타입의 클래스를 리턴한다.)
    virtual IDao* getTypeDao() = 0;
    };
    
    // ATypeDAO 클래스, IDao 추상 클래스를 상속
    class ATypeDAO : public IDao {
    public:
    // 함수 재정의
    virtual string getData() {
    // string 값 리턴
    return "ATypeDAO - getData()";
    }
    };
    
    // 팩토리 클래스, IFactory 추상 팩토리 클래스를 상속
    class AFactory : public IFactory {
    public:
    // 함수 재정의해서 ATypeDAO 클래스의 인스턴스를 리턴한다.
    virtual IDao* getTypeDao() {
    return new ATypeDAO();
    }
    };
    
    // BTypeDAO 클래스, IDao 추상 클래스를 상속
    class BTypeDAO : public IDao {
    public:
    // 함수 재정의
    virtual string getData() {
    // string 값 리턴
    return "BTypeDAO - getData()";
    }
    };
    
    // 팩토리 클래스, IFactory 추상 팩토리 클래스를 상속
    class BFactory : public IFactory {
    public:
    // 함수 재정의해서 BTypeDAO 클래스의 인스턴스를 리턴한다.
    virtual IDao* getTypeDao() {
    return new BTypeDAO();
    }
    };
    
    // 팩토리 패턴, 파라미터 값의 의해 팩토리 클래스의 인스턴스를 리턴한다.
    IFactory* getFactory(int type) {
    // 0의 값이라면 AFactory 클래스의 인스턴스를 리턴
    if (type == 0) {
    return new AFactory();
    }
    // 0의 값이 아니라면 AFactory 클래스의 인스턴스를 리턴
    else {
    return new BFactory();
    }
    }
    
    // 실행 함수
    int main() {
    // 팩토리 함수로부터 팩토리 인스턴스를 받는다.
    IFactory* factory = getFactory(0);
    // 함수를 통해서 ATypeDAO 클래스의 인스턴스를 받는다.(여기서는 빌드 패턴(여기서 다시 팩토리 패턴을 넣어도 된다.))
    IDao* dao = factory->getTypeDao();
    
    // 콘솔에 출력
    cout << dao->getData() << endl;
    
    // 메모리 해제
    delete dao;
    delete factory;
    
    // 팩토리 함수로부터 팩토리 인스턴스를 받는다.
    factory = getFactory(1);
    // 함수를 통해서 BTypeDAO 클래스의 인스턴스를 받는다.(여기서는 빌드 패턴(여기서 다시 팩토리 패턴을 넣어도 된다.))
    dao = factory->getTypeDao();
    
    // 콘솔에 출력
    cout << dao->getData() << endl;
    
    // 메모리 해제
    delete dao;
    delete factory;
    return 0;
    }

     

    문제점

    1. 제품군이 늘어날 수록 클래스의 개수도 늘어난다.

    2. 새로운 제품이 추가되어야 할 경우, 모든 팩토리 클래스를 수정해야 한다.

     

     

    참고 사이트

    https://gmlwjd9405.github.io/2018/08/08/abstract-factory-pattern.html

     

    [Design Pattern] 추상 팩토리 패턴이란 - Heee's Development Blog

    Step by step goes a long way.

    gmlwjd9405.github.io

    https://nowonbun.tistory.com/434

     

    [Design Pattern] 1-4. 추상 팩토리 패턴 (Abstract factory pattern)

    안녕하세요. 명월입니다. 이 글은 디자인 패턴의 추상 팩토리 패턴(Abstract factory pattern)에 대한 글입니다. 디자인 패턴의 생성 패턴 중에서 가장 복잡한 패턴인 추상 팩토리 패턴입니다. 구조는

    nowonbun.tistory.com

     

Designed by Tistory.