공장 방법

Design patterns should not be applied indiscriminately. Often they achieve flexibility and variability by introducing additional levels of indirection, and that can complicate a design and/or cost you some performance. A design pattern should only be applied when the flexibility it affords is actually needed - Erich Gamma



소개



소프트웨어 개발의 가장 큰 과제 중 하나는 손쉬운 확장성, 유지 관리 및 유연성을 가능하게 하는 코드를 작성하는 방법입니다.

이 문제에 대한 한 가지 해결책은 누구나 쉽게 이해하고 기여할 수 있도록 깨끗하고 체계적인 코드를 작성하는 모범 사례 지침인 디자인 패턴을 사용하는 것입니다.

디자인 패턴은 크게 4가지로 나눌 수 있습니다.
  • 생성: 개체 인스턴스화
  • 구조: 클래스 관계 및 계층 구조
  • 동작: 객체 상호 통신

  • 생성 범주에는 다음과 같은 다섯 가지 방법이 있습니다.
  • 팩토리 메소드
  • 추상 메서드
  • 빌더 방식
  • 시제품 방법
  • 싱글톤 방식

  • 오늘 우리는 Factory 방법에 초점을 맞출 것입니다!

    팩토리 메소드란?



    팩터리 메서드는 관련 객체의 생성을 캡슐화하여 객체를 생성하는 인터페이스를 제공하지만 생성을 하위 클래스로 연기합니다. 이것은 가장 많이 사용되는 방법 중 하나이며 그 이유는 다음과 같습니다.
  • 런타임 매개변수를 기반으로 개체를 생성합니다
  • .
  • 어떤 객체가 필요한지 알 필요가 없음
  • 하위 클래스가 최소값 대신 개체를 인스턴스화하도록 합니다
  • .
  • 쉽게 새 제품을 추가하거나 기존 제품을 변경합니다
  • 전체적으로 변경할 필요 없음
  • 개체를 포함하도록 확장 가능
  • 한 곳에 위치한 개체 생성
  • 쉽게 공장 간 전환

  • 구조



    팩토리 메소드에는 세 가지 구조가 있습니다.
  • 클래스 작성자: 팩토리 메서드의 일부 기본 구현을 제공합니다.
  • 콘크리트 생성기: 결과 제품의 유형을 변경하려면 팩토리 방법을 재정의합니다.
  • 구체적인 제품: 제품 인터페이스의 다양한 구현을 제공합니다.

  • 관행



    여기서 우리는 다양한 유형의 암석을 생성해야 하는 게임의 매우 간단한 예를 통해 Factory Method를 사용하는 방법을 배웁니다. 처음에는 소형 및 중형의 두 가지 유형의 암석이 있습니다. 코드가 작성되는 방식은 새로운 유형의 암석(예: Big, Iron)을 등록하는 것이 매우 쉬울 것입니다.

    #include <iostream>
    
    using namespace std;
    
    //Class creator
    class rock {
    public:
        rock(){}
        char *getType(){
            return _type;
        }
    };
    
    //Concrete product
    class smallRock:public rock{
    public:
        smallRock(){
            //_type = "Small";
            cout << "\nSmall rock created" << endl;
        }
    };
    
    //Concrete product
    class midRock:public rock{
    public:
        midRock(){
            //_type = "mid";
            cout<<"\nMid rock created" << endl;
        }
    };
    
    /*Creator concrete*/ 
    class rockFactoryCreator{
    public:
        rock *GetRock(){
            int choice;
            cout << "Select type of rock to make: " << endl;
            cout << "1: Small" << endl;
            cout << "2: Mid" << endl;
            cout << "Selection: ";
            cin >> choice;
    
            switch (choice)
            {
            case 1:
                return new smallRock;
            case 2:
                return new midRock;
            default:
                cout << "Invalid Selection" << endl;
                return NULL;
            }  
        }
    };
    
    int main()
    {
        rockFactoryCreator rockCreator;
        rock *asteroid; 
        asteroid = rockCreator.GetRock();
        system("PAUSE");
        return 0;
    }
    

    좋은 웹페이지 즐겨찾기