IT

왜 우리는 추상 팩토리 디자인 패턴이 필요합니까?

lottoking 2020. 7. 13. 07:47
반응형

왜 우리는 추상 팩토리 디자인 패턴이 필요합니까?


대부분의 정의는 다음과 가변적입니다.

추상 팩토리는 구체적인 클래스를 지정하지 않고 관련 클래스를 작성하기위한 인터페이스를 제공합니다.

자체 클래스 자체의 객체를 생성하여 작업을 수행 할 수 있으므로 추상 팩토리 패턴을 사용하는 무엇입니까? 왜 Concrete 클래스의 객체를 생성하는 팩토리 메소드가 있습니까?

abstractFactory 패턴을 구현해야하는 실제 사례를 알려주십시오.


Abstract Factory는 의존성 제공 (DI)을 위한 매우 중심적인 디자인 패턴입니다 . 은 추상 제작소를 다음이 적용 솔루션 으로 채택 된 스택 오버플로 질문 목록입니다 .

내가 이해하기 위해, 질문들은 사람들이 가지고있는 실제 관심사 또는 문제를 실제 사례를 시작해야합니다.


Abstract Factory 패턴을 사용하는 실제 예는 서로 다른 두 데이터 소스 (예 : SQL 데이터베이스 및 XML 파일)에 대한 데이터 액세스를 제공하는 것입니다. 서로 다른 두 가지 데이터 액세스 클래스 (데이터 저장소에 대한 게이트웨이)가 있습니다. 둘 다 구현할 메소드 메소드 (예 :로드, 저장, 삭제)를 정의하는 기본 클래스에서 상속합니다.

어떤 데이터 소스를 있는지 있는지 클라이언트 코드가 데이터 액세스 클래스를 검색하는 방식을 변경합니다. Abstract Factory는 어떤 데이터 소스를 알고 있는지 확인합니다. 팩토리는이 인스턴스를 기본 클래스 유형으로 리턴합니다.


내가 당신을보고 이해한다면, 문제는 왜 우리가 팩토리 메소드와 추상 팩토리 패턴을 가지고 있습니까? 다른 다형성 클래스의 인스턴스화 절차가 다른 경우 추상 팩토리가 필요합니다. 또한 초기화 초기화에 대한 세부 사항을 모르고 일부 모듈에서 만들어 사용합니다. 예를 들어 계산을 수행하는 Java 객체를 만들려고합니다. 그러나 그중 일부는 응용 프로그램의 일부이며 다른 바이트 코드는 DB에서 읽어야합니다. 반면에 왜 공장 방법이 필요한가? 그 추상 팩토리가 겹칩니다. 그러나 어떤 경우에는 작성하는 코드가 훨씬 적고 클래스와 인터페이스가 적어 시스템을 쉽게 사용할 수 있습니다.


자체 클래스 자체의 객체를 생성하여 작업을 수행 할 수 있으므로 추상 팩토리 패턴을 사용하는 무엇입니까? 왜 Concrete 클래스의 객체를 생성하는 팩토리 메소드가 있습니까?

추상 팩토리가 운영 소개 고객은 구체적인 클래스에 대한 세부 사항을 알아야합니다. 이 타이트한 커플 링은 Abstract Factory 에서 제거되었습니다 .

이제 Factory Method 는 클라이언트가 사용하는 계약을 공개합니다. Factory Method에 의해 노출 된 인터페이스를 구현하는 새로운 제품을 추가하여 공장에서 제품을 더 추가 할 수 있습니다.

더 나은 이해를 위해 다음 관련 SE 질문을 참조하십시오.

팩토리 패턴과 추상 팩토리 패턴의 기본 차이점은 무엇입니까?

의지 :

구체적인 클래스를 지정하지 않고 관련 또는 작성하기위한 인터페이스를 제공하십시오.

소스 메이킹 기사 에서 추상적 인 팩토리 패턴 의도, 구조, 목록 및 규칙 점검을 이용할 수 있습니다 .

점검표 :

  1. 플랫폼 독립성 및 제작 서비스가 현재 고통의 근원 인지 결정하십시오 .
  2. 플랫폼제품 의 매트릭스를 작성하십시오 .
  3. 제품 당 팩토리 시스템으로 팩토리 인터페이스정의하십시오 .
  4. 새 연산자에 대한 모든 참조를 캡슐화하는 각 플랫폼에 대해 팩토리 파생 클래스를 정의하십시오 .
  5. 클라이언트는 새에 대한 모든 참조를 새에 팩토리 메소드를 작성하기 위해 제품을 작성 합니다.

Abstract Factory는 코드 기반을 통합하면서 여러 플랫폼을 지원하는 데 적합합니다. Windows, Linux 및 OSX에서 실행하려는 대형 Qt 또는 GTK + 또는 .NET / Mono 프로그램이 가정합니다. 그러나 각 플랫폼에서 다른 방식으로 구현되는 기능이 있습니다 (아마도 kernel32 API 또는 POSIX 기능을 통해).

public abstract class Feature
{
    public abstract int PlatformSpecificValue { get; }

    public static Feature PlatformFeature
    {
        get
        {
            string platform;
            // do platform detection here
            if (platform == "Win32")
                return new Win32Feature();
            if (platform == "POSIX")
                return new POSIXFeature();
        }
    }

    // platform overrides omitted
}

이 Abstract Factory를 사용하면 UI가 현재 플랫폼에 대해 알 필요가 없습니다.

Feature feature = Feature.PlatformFeature;
Console.WriteLine(feature.PlatformSpecificValue);

디자인 패턴을 보면 거의 모든 패턴이있을 수 있습니다. 그러나 어떤 패턴이있는 유형의 문제에 대한 접근 방식을 일반적으로 사용하는 접근 방식을 의미하는지 디자인 패턴은 시도 유형의 디자인 문제에 대한 디자인 수준 접근 방식 또는 솔루션을 제공합니다. 디자인 패턴을 사용하면 문제를 해결하고 더 빨리 제공 할 수 있습니다.


추상화와 함께 작동하는 코드가 실제 사물 이미징 할 수있는 구체적인 클래스가 아닌 추상화를합니다.

코드를 더 잘 정리할 수 있으므로 항상 추상화에 대해 작업해야합니다.

이것은 좋은 예입니다 : http://en.wikipedia.org/wiki/Abstract_factory_pattern#C.23


인스턴스화가 매우 복잡하고 단일 팩토리 복잡하고 추악하고 UI가 이해하기 너무 복잡하고 복잡한 곳에서 단순한 팩토리 패턴이없는 추상적 인 패턴이있는 곳이 있다는 생각합니다.

이것이 단일 클래스가 아닌 TYPE_A 브랜드라고 가정 해봅시다. 100 가지 종류의 유형 -A 클래스가 있고 그로부터 하나의 클래스가 인스턴스화해야 가정 해 보겠습니다. 많은 객체 유형의 객체를 조정 브랜드에서 올바른해야하는 객체를 만들기 위해 세부적인 조정적인 정보가 어떤 변수가 있는지 확인합니다.

이 브랜드를위한 특별한 팩토리에서 우리는 차별화하고 인스턴스화 할 수있는 것입니다. 우리는 인터넷 (온라인 상점에서 어떤 색상을 사용할 수 있는지)의 입력과 백그라운드에서 실행되는 다른 애플리케이션 및 서비스 (UI가 인식하지 않는 다음 애플리케이션 및 서비스)의 입력에 따라 알 수 있습니다.

그리고 아마도 내일 우리는 인스턴스화하기 위해 type_B와 type_C의 또 다른 패밀리를 것입니다. 따라서 UI는 사용자가 "type_A", "type_B"또는 "type_C"를 원하는지 여부를 알 수있는 "if else"가 있습니다. 그러나 팩토리 클래스는 빌드 할 유형 (패밀리에서)의 클래스를 정확하게 결정합니다. 조정 방법 – 매개 변수에 설정하거나 계약자에게 보낼 값. 이 모든 것-UI가 인식하지 못하는 많은 변수에 따라. 이 모든 것은 하나의 공장 수업에 너무 많은 것입니다.


Abstract Factory 패턴이 과대 평가되었습니다.

우선,이 발생하지 않는 것을 당신의 설정에서 종종 상호 인스턴스화 하려는 유형입니다.

둘째, 인터페이스에서 제공하는 간접 (추상화) 수준은 일반적으로 충분하게 작업 할 때 충분합니다.

WindowsButton, MacButton, WindowsScrollBar, MacScrollbar 등이있는 WindowsGui 대 MacGui 대 ...의 전형적인 예는 방문자 구현 및 / 또는 인터프리터 패턴을 사용하여 구체적인 버튼, 스크롤바 등을 정의하여하기가 더 많이 있습니다. 실제 행동.


질문에 직접 답하기 이러한 디자인 패턴을 사용하지 않을 수 있습니다.

그러나 현실 세계의 대부분의 프로젝트는 진화하고 있으며 미래에 대비할 수있는 확장을 제공하고자합니다.

내 경험으로 볼 때 대부분의 경우 Factory가 구현되고 프로젝트가 성장에 따라 디자인 따라 Abstract Factory와 같은 더 복잡한 패턴으로 변경됩니다.


의존성에 관한 것입니다. 딱한 결합과 관심이 외관 추상 팩토리가 필요하지 않습니다. 그러나 유지 관리가 필요한 응용 프로그램을 작성하자마자 중요합니다.


a.jar을 만들고 다른 사람이 jar를 사용하고 코드에서 새로운 구체적인 객체를 사용하려고 가정 해 보겠습니다. 추상 팩토리를 사용하지 않는 경우 코드를 수정하거나 코드를 써야합니다. 그러나 추상적 인 팩토리를 사용하는 경우 팩토리를 제공하고 코드에 많은 것이 모든 것이 정상입니다.

개선 된 버전 : 다음 시나리오를 고려하십시오. 다른 사람이 프레임 워크를 작성했습니다. 프레임 워크는 추상적 인 팩토리와 일부 구체적인 팩토리를 사용하여 런타임에 많은 개체를 만듭니다. 따라서 자신의 팩토리를 기존 프레임 워크에 쉽게 등록하고 자신만의 개체를 만들 수 있습니다. 프레임 워크는 수정이 불가능하며 확장하기 인 팩토리 패턴으로 인해 확장하기.


이 패턴은 클라이언트가 생성 할 유형을 정확히 알지 못하는 경우 특히 유용합니다. 예를 들어 휴대폰만을 판매하는 쇼룸이 삼성에서 만든 스마트 폰에 대한 쿼리를받는다고 가정 해 보겠습니다. 여기서 우리는 생성 될 개체의 정확한 유형을 알지 못합니다 (전화에 대한 모든 정보가 구체적인 개체 형태로 래핑되고 가정). 그러나 우리는 삼성에서 제조 한 스마트 폰을 생각하는 것을 알고 있습니다. 이 정보는 우리의 디자인에 Abstract Factory 구현이있는 경우 실제로 사용할 수 있습니다.

C #에서 추상 팩토리 패턴 이해 및 구현

참고 URL : https://stackoverflow.com/questions/2280170/why-do-we-need-abstract-factory-design-pattern

반응형