문제

아래는 .NET Framework의 패턴 사용에 대한 기사입니다. 아래 발췌 내에서 굵은 부분을 이해하는 것이 확실하지 않습니다. 객체 생성의 세부 사항을 변경하면 생성자 인수를 변경할 수 있습니까?

프레임 워크에는 생성자를 직접 호출하지 않고 구조물 또는 클래스의 새로운 인스턴스를 얻을 수있는 많은 사례가 있습니다. System.Convert 클래스에는 이와 같이 작동하는 다양한 정적 메소드가 포함되어 있습니다. 예를 들어 정수를 부울로 변환하려면 Convert.Toboolean으로 전화하여 정수를 통과 할 수 있습니다. 이 메소드 호출의 반환 값은 정수가 0이 아닌 "false"인 경우 "True"로 설정된 새로운 부울입니다. Convert 클래스는 올바른 값으로 부울을 만듭니다. 다른 유형 변환 방법도 비슷하게 작동합니다. int32의 구문 분석 방법 및 해당 객체의 새로운 인스턴스는 문자열 만 주어진 적절한 값으로 설정합니다.

새로운 객체 인스턴스를 만드는이 전략을 공장 패턴이라고합니다. 객체의 생성자를 호출하지 않고 객체 공장에 인스턴스를 만들도록 요청할 수 있습니다. 이렇게하면 공장 클래스는 객체 생성의 복잡성을 숨길 수 있습니다 (문자열의 두 배를 구문 분석하는 방법). 객체 생성의 세부 사항을 변경하려면 공장 자체 만 변경하면됩니다. 생성자가 호출되는 코드의 모든 장소를 변경할 필요는 없습니다.

에서: http://msdn.microsoft.com/en-us/magazine/cc188707.aspx.

도움이 되었습니까?

해결책

실제로 그들이 제공 한 예제가 반드시 위대한 예일 필요는 없다고 생각합니다.

공장 패턴은 클래스를 구성 할 때 .NET에서 더 유용 해집니다. 예를 들어, WebRequest 클래스.

이 수업은 일반적으로 다음을 호출하여 인스턴스화됩니다.

WebRequest request = WebRequest.Create(url);

그만큼 WebRequest.create 메소드는 공장 패턴을 사용합니다. URL 유형에 따라 WebRequest의 다른 유형 (서브 클래스)이 생성됩니다. 당신이 그것을 통과한다면 http:// 예를 들어 URL은 실제로 httpwebrequest 인스턴스 - an ftp:// URL은 ftpwebrequest.

여기에서 공장 패턴을 사용하면 클라이언트 측의 코드를 변경하지 않고 나중에 더 많은 URL 유형을 추가 할 수 있습니다. 다른 URL (문자열로)을 전달하고 새 개체를 얻습니다.

다른 팁

공장의 전체 아이디어는 다른 것 같습니다. 그것은 단지 구현의 복잡성을 숨기는 것이 아니라 제어의 역전에 관한 것입니다 (IOC).

  • 생성하는 대신 Sender 그리고 Receiver 당신 자신의 반대, 만들자 MessageFactory 그것들을 만드는 책임있는 대상.
  • 처음에 우리가 구현했다고 상상해 봅시다 TcpMessageFactory (MessageFactory 후손) 창조 TcpSender 그리고 TcpReceiver 사물. 이제 우리의 응용 프로그램은 TCP와 함께 작동합니다.
  • 조금 후에 우리는 UDP가 더 빠르다는 것을 발견했습니다. 그래서 우리는 구현했습니다 UdpSender 그리고 UdpReciever. 또한, 우리는 구현했습니다 UdpMessageFactory (MessageFactory 후손도)
  • 이제 사용자가 사용할 프로토콜을 선택할 수 있습니다. 이를 바탕으로 공장 객체를 만듭니다 ( TcpMessageFactory 또는 UdpMessageFactory) 그리고 우리의 응용 프로그램에서 더 사용하십시오.

이 예에서 MessageFactory.CreateSender 그리고 MessageFactory.CreateReciever 추상적 인 방법이어야합니다. 방법 Sender & Reciever 공개 API (계약)를 형성하는 것도 추상적이어야합니다.

BTW, 초기 공장은 주로 객체 생성에 사용되었습니다. C ++ 라이브러리 (DLL)는 메인 .EXE에 자체 유형 세트를 만들 수 있어야합니다. 다른 모듈 사이의 인스턴스를 전달합니다. 구조는 특정 컴파일러에 의존하기 때문에 거의 불가능합니다. 그러나 인터페이스를 통과 할 수 있습니다. 그러한 DLL은 다음과 같습니다.

  • 기능 반환 공장 인터페이스를 내보내십시오 IDllTypeFactory
  • 그것을 구현하는 객체가 반환해야합니다 IDllTypeXxx 그것의 호출에 대한 대상 CreateXxx 행동 양식. 이것들 IDllTypeXxx 실제로 우리가 원래 수출 할 유형에 의해 구현됩니다.

그러나 아시다시피. 또한 반사를 통해 전혀 모르는 유형을 만들 수 있습니다. 따라서 .NET의 공장은 더 드물게 사용됩니다.

공장 패턴은 제 프로그램에서 가장 많이 사용하는 패턴입니다. 특정 경우에 매우 도움이 될 수 있지만 사용할 때주의해야합니다. 공장이 생성자 오버로드처럼 보이면 생성자 과부하가되어야합니다. MSDN 기사에서 제공 한 예제는 좋지 않습니다. 사실, int, string 등과 같은 객체가 서로에 대한 과부하를 고려하지 않는 것은 꽤 오랫동안 나의 믿음이었습니다. 스트러크 클래스가 아니라 일반적으로 구조물 생성자는 예외를 제외하지 않아야합니다 (예 : "Hello World"를 Int에 공급할 수있는 경우 발생합니다). 그러나 나는 그것을 가정했다.

물론 웹 주변에는 공장 패턴과 그 이점을 사용하는시기에 대한 더 나은 설명을 찾을 수있는 많은 장소가 있습니다. Reed가 제공 한 예는 최고 중 하나이며 공장 사용에 대한 나의 규칙을 따릅니다. 나는 특정 인터페이스를 구현하는 클래스 계층 또는 여러 클래스가있을 때 공장을 사용하고 해당 객체 중 하나를 만들고 싶지만 개체를받습니다. 객체 자체가 아닌 슈퍼 클래스/인터페이스의. 그렇게하면 공장을 부르는 물건 구현 세부 사항에 대해 걱정할 필요가 없습니다. 그것은 특정 클래스의 대상을 기대하고 있다는 것을 알고 있으며, 그것이 캐스트 일지라도 그것이 얻는 것입니다.

현재 구축하는 응용 프로그램 (프로그램 생성기)에서는 DataTable SQL 정의를 구문 분석해야합니다. 나는 그것을하기 위해 홈 양조 arpser를 사용합니다. 파서가 변수 ( "식별자 변수 유형")가 발생할 때마다 공장을 호출하여 문자열을 전달합니다. 그런 다음 공장은 가변 유형의 서브 스트링을 확인하고 나에게 반환합니다. sqlvariable, 그것은 실제로 일 수 있습니다 integersqlvariable 또는 a charsqlvariable.

메인 파서 객체는 어떤 변수를 얻었는지 모릅니다. sqlvariable을 목록으로 밀고 다음 줄을 읽습니다. 물론 모든 변수 유형을 처리하기 위해 단일 클래스를 가질 수 있습니다. 나는 개인적으로 그렇게하지 않기로 선택합니다.

예, 생성자 오버로드를 사용하여 소스 코드의 모든 영역을 변경하지 않고 생성자를 변경할 수 있지만 조심하지 않으면 말도 안되는 수의 생성자로 이어질 수 있습니다.

이 기사의 일반적인 아이디어는 생성자 변경을 설명하기 위해 대규모 생성자 과부하를 방지하기보다는 구현을 숨기고 있다고 생각합니다. 대상이라는 아이디어는 그것이 어떻게 구성 될 수 있는지에 대한 지식이 없어야합니다.

주어진 예에서, 당신은 int 클래스가 문자열에서 int가 될 수있는 방법으로 int 클래스를 막고 싶지 않으므로, 당신은 y 매개 변수에서 x 객체를 만드는 것이 유일한 공장을 만드는 공장을 만듭니다.

나는 Head First Design Patterns 책을 학습 디자인 패턴에 대한 좋은 소개로 제안합니다. 예제는 Java 기반이지만 사용중인 언어에 관계없이 그 뒤에있는 논리는 적용됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top