2016-12-05 9 views
2

저는 현재 팩토리 디자인 패턴을 구현하려고하고 있는데, C++에서 일반적으로 어떻게 수행되는지 다소 혼란 스럽습니다. 나는 this 웹 페이지를 언급 ​​해왔다.네임 스페이스 함수 대신 정적 클래스 함수를 사용하는 경우?

그래서이 웹 페이지에서는 ComputerFactory라는 팩토리 클래스를 정의하는 예제를 보여줍니다. 이 클래스에는 고정 된 단일 NewComputer 메서드가 있습니다.

class ComputerFactory 
{ 
public: 
    static Computer *NewComputer(const std::string &description) 
    { 
     if(description == "laptop") 
      return new Laptop; 
     if(description == "desktop") 
      return new Desktop; 
     return NULL; 
    } 
}; 

NewComputer 정적이라는 사실은이 ComputerFactory의 단일 인스턴스와 관련이없는 것을 의미합니다. 따라서 코드에서이 메서드를 호출하여 작성할 수 있습니다.

ComputerFactor::NewComputer("description"); 

이제이 클래스를 래핑해야하는 이유가 궁금합니다.

  • 인가 내가 유효한 설명 네임 스페이스 기능을 : 그것은 모든 클래스와 연결하는 것은 아닙니다 정말 정적 그리고 있기 때문에, 내 질문에 그래서

    namespace ComputerFactory 
    { 
        static Computer *NewComputer(const std::string &description) 
        { 
         if(description == "laptop") 
          return new Laptop; 
         if(description == "desktop") 
          return new Desktop; 
         return NULL; 
        } 
    } 
    

    같은 일을하는 것이 더 나을 대안?

  • 정적 메서드 만 가진 클래스를 정의하는 것이 이치에 맞습니까? 네임 스페이스를 사용하는 것이 더 합리적이라고 생각됩니다.

이제 정적 인 방법 (예 : 정적 인 '현재 클래스가 몇 개인 지')이 필요한 경우가 있다고 생각하지만 이는 필요한 상황이 아닌 것으로 보입니다. 이견있는 사람?

편집 : 그래서 방금 언급 한 예제는 '일반적인'공장 방법이 아닙니다. 실제로 팩토리 함수가 더 복잡하고 다른 함수 (private 클래스 메소드)를 호출해야 할 수도 있습니다. 이 경우 하위 함수에 액세스 할 수있는 클래스로 팩토리를 래핑하는 것이 좋습니다. 팩토리 메서드가 일반적으로 클래스로 래핑되는 이유는 무엇입니까?

답변

2

유효한 대안을 설명한 네임 스페이스 기능이 있습니까?

그것은 이제까지 정적 메소드가있는 클래스를 정의 할 말이겠습니까? 네임 스페이스를 사용하는 것이 더 합리적이라고 생각됩니다.

이 방법이 많은 클래스에서 사용할 수있는 유틸리티 방법 인 경우 namespace에 더 적합 할 것입니다.

메쏘드가 클래스에 특화된 것이라면 클래스 자체 안에 static을 만들어라. 그러면 캡슐화가 더 잘될 것이다.

0

유효한 대안을 설명한 네임 스페이스 기능이 있습니까?

예.

정적 메서드 만있는 클래스를 정의하는 것이 이치에 맞습니까? 네임 스페이스를 사용하는 것이 더 합리적이라고 생각됩니다.

네임 스페이스로 수행 할 수없는 클래스로 수행 할 수있는 작업이 있습니다.
익명 네임 스페이스를 사용하여 비슷한 것을 수행 할 수 있지만 실제로는 그렇게 좋지는 않지만 (비공개 멤버를 사용하기 위해) 그 중 하나를 언급했습니다.

또 다른 관련 예제는 templatize 네임 스페이스가 아니며 매우 성가시다는 것입니다. 당신은 단지 그것을 네임 스페이스를 사용하는 경우 함수 템플릿을 정의 할 수 있습니다, 다른 측면에서

namespace N { 
    template<typename T> 
    T f() { return T(); } 

    // Other function template 
} 

// ... 

N::f<int>(); 

:

template<typename T> 
struct S { 
    static T f() { return T(); } 
    // Other member functions 
}; 

// ... 

using MyS = S<int>; 
MyS::f(); 

이 템플릿으로 발생 : 예를 들어
,이 클래스와 발생 어떠한 상황에서도 최고의 해결책이 될 수는 없습니다.
또한 클래스와 마찬가지로 별칭을 만들 수 없으므로 모든 호출 위치의 유형에 대해 명시해야하며 오류가 발생하고 리팩터링하기가 어려울 수 있습니다.