[factory-pattern] 추상 팩터 리 패턴과 팩토리 방법의 차이점



5 Answers

abstract 팩토리는, 생성해야 할 객체의 메소드를 정의하는 추상 메소드를 사용해, 기본 클래스를 작성합니다. 기본 클래스를 파생시키는 각 팩토리 클래스는 각 객체 유형에 대한 자체 구현을 작성할 수 있습니다.

팩토리 메서드 는 클래스에서 객체를 만드는 데 사용되는 단순한 메서드입니다. 일반적으로 집계 루트에 추가됩니다 ( Order 클래스에는 CreateOrderLine 이라는 메서드가 있음)

초록 공장

아래 예에서 우리는 메시징 시스템에서 큐 생성을 분리 할 수 ​​있도록 인터페이스를 설계하므로 코드 기반을 변경하지 않고도 다른 큐 시스템에 대한 구현을 작성할 수 있습니다.

interface IMessageQueueFactory
{
  IMessageQueue CreateOutboundQueue(string name);
  IMessageQueue CreateReplyQueue(string name);
}

public class AzureServiceBusQueueFactory : IMessageQueueFactory
{
      IMessageQueue CreateOutboundQueue(string name)
      {
           //init queue
           return new AzureMessageQueue(/*....*/);
      }

      IMessageQueue CreateReplyQueue(string name)
      {
           //init response queue
           return new AzureResponseMessageQueue(/*....*/);
      }

}

public class MsmqFactory : IMessageQueueFactory
{
      IMessageQueue CreateOutboundQueue(string name)
      {
           //init queue
           return new MsmqMessageQueue(/*....*/);
      }

      IMessageQueue CreateReplyQueue(string name)
      {
           //init response queue
           return new MsmqResponseMessageQueue(/*....*/);
      }
}

공장 방법

HTTP 서버의 문제는 모든 요청에 ​​대해 항상 응답해야한다는 것입니다.

public interface IHttpRequest
{
    // .. all other methods ..

    IHttpResponse CreateResponse(int httpStatusCode);
}

팩토리 메소드가 없다면, HTTP 서버 사용자 (즉, 프로그래머)는 IHttpRequest 인터페이스의 목적을 IHttpRequest 하는 특정 구현 클래스를 사용해야 할 것입니다.

따라서 팩토리 메소드를 도입하여 응답 클래스 작성을 추상화합니다.

개요

차이점은 팩토리 메소드를 포함하는 클래스의 의도 된 목적객체를 생성하지 않는 반면 추상 팩토리는 객체를 생성하는 데에만 사용해야한다는 것입니다.

객체를 만들 때 LSP ( Liskovs 대체 원칙 )를 깨기 쉽기 때문에 팩토리 메소드를 사용할 때는주의해야합니다.

Question

이 두 패턴의 차이점에 대해 많은 게시물이 있다는 것을 알고 있지만 찾을 수없는 몇 가지 사항이 있습니다.

필자가 읽은 바에 따르면 팩토리 메서드 패턴을 사용하면 하나의 구체적인 제품을 만드는 방법을 정의 할 수 있지만 일반 제품을 볼 때 클라이언트에서 구현을 숨길 수 있습니다. 나의 첫 번째 질문은 추상적 인 공장에 관한 것이다. 하나의 구체적인 객체가 아닌 구체적인 객체의 패밀리를 만들 수있게 해주는 역할입니까? 추상 팩토리는 호출하는 메서드에 따라 매우 큰 객체 하나 또는 많은 객체 만 반환합니까?

마지막 두 가지 질문은 내가 여러 곳에서 본 것을 완전히 이해할 수없는 작은 따옴표에 관한 것입니다.

두 가지의 한 가지 차이점은 Abstract Factory 패턴을 사용하면 클래스가 컴포지션을 통해 다른 객체에 객체 인스턴스화의 책임을 위임하는 반면 Factory Method 패턴은 상속을 사용하고 원하는 객체 인스턴스화를 처리하는 하위 클래스에 의존한다는 것입니다.

필자가 알기로는 팩토리 메서드 패턴에 Creator 인터페이스가있어 ConcreteCreator가 인스턴스화 할 ConcreteProduct를 알 수 있도록 할 것이다. 개체 인스턴스화를 처리하기 위해 상속을 사용하면 이것이 의미하는 바입니까?

이제 해당 견적과 관련하여 Abstract Factory 패턴은 작곡을 통해 객체 인스턴스화의 책임을 다른 객체에 얼마나 위임합니까? 이것은 무엇을 의미 하는가? 초록 공장 패턴도 상속을 사용하여 내 눈에서 건설 프로세스를 수행하는 것처럼 보입니다.하지만 다시 이러한 패턴에 대해 배우고 있습니다.

특히 마지막 질문에 도움이된다면 크게 감사하겠습니다.




Abstract Factory는 관련 제품을 생성하기위한 인터페이스이지만 Factory Method는 하나의 메소드에 불과합니다. Abstract Factory는 여러 Factory Methods로 구현할 수 있습니다.




  1. 나의 첫 번째 질문은 추상적 인 공장에 관한 것이다. 하나의 구체적인 객체가 아닌 구체적인 객체의 패밀리를 만들 수있게 해주는 역할입니까?

예. 초록 공장의 의도는 다음과 같습니다.

구체적인 클래스를 지정하지 않고 관련 객체 또는 종속 객체의 패밀리를 작성하기위한 인터페이스를 제공합니다.

  1. 추상 팩토리는 호출하는 메서드에 따라 매우 큰 객체 하나 또는 많은 객체 만 반환합니까?

클라이언트가 호출하는 메소드마다 하나의 객체를 반환하는 것이 이상적입니다.

  1. 필자가 알기로는 팩토리 메서드 패턴에 Creator 인터페이스가있어 ConcreteCreator가 인스턴스화 할 ConcreteProduct를 알 수 있도록 할 것이다. 개체 인스턴스화를 처리하기 위해 상속을 사용하면 이것이 의미하는 바입니까?

예. 팩토리 메소드는 상속을 사용합니다.

  1. 추상 팩터 리 패턴은 컴포지션을 통해 객체 인스턴스화의 책임을 다른 객체에 위임합니까? 이것은 무엇을 의미 하는가?

AbstractFactory는 FactoryMethod를 정의하고 ConcreteFactory는 ConcreteProduct를 작성합니다. article 의 코드 예제를 따라하면 됩니다.

관련 SE 게시물에서 자세한 내용을 확인할 수 있습니다.

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

디자인 패턴 : 팩토리 대 팩토리 메소드와 추상 팩토리




언제든지 Factory Methods를 통해 Abstract Factory를 선호 할 것입니다. 위의 Tom Dalling의 예제 (훌륭한 설명 btw)에서 우리는 추상 팩토리가 더 복잡하다는 것을 알 수 있습니다. 우리가해야 할 일은 생성자에 다른 팩토리를 전달하는 것입니다 (여기에서 사용되는 생성자 종속성 주입). 그러나 Factory Method는 우리가 새로운 클래스 (더 많은 것들을 관리)를 소개하고 서브 클래 싱을 사용해야한다고 요구합니다. 상속보다 컴포지션을 항상 선호합니다.




생산 코드의 대부분은 클래스 A가 인터페이스 B로 프로그램되어 있기 때문에 추상적 인 팩토리 패턴을 사용한다는 것을 분명히 알리십시오. 그리고 A는 B의 인스턴스를 생성해야합니다. 따라서 A는 B의 인스턴스를 생성하는 팩토리 객체를 가져야합니다 그래서 A는 B의 구체적인 인스턴스에 의존하지 않습니다. 도움이 되길 바랍니다.




내가 정확하게 그것을 넣어 수 있습니다. 대부분의 해답은 다이어그램과 예제를 제공하여 이미 설명했습니다. 그래서 내 anwer는 단지 하나의 라이너가 될 것입니다. 내 자신의 말 : "추상 팩터 리 패턴은 여러 팩토리 메소드 구현에 대한 추상 레이어에 추가됩니다. 추상 팩토리 1 개 또는 복수의 팩토리 메소드 패턴을 포함 또는 합성하고있는 것을 의미한다 "




Related