[java] 팩토리 패턴과 전략 패턴의 차이점은 무엇입니까?

공장과 전략 패턴의 차이점을 설명 할 수있는 사람이 있습니까?

나를 위해 둘 다 여분의 팩토리 클래스 (공장 패턴으로 제품 객체를 만드는 것) 이외의 다른 것을보고 있습니다.



답변

팩토리 패턴은 생성 패턴입니다. 전략 패턴은 운영 패턴입니다. 다시 말해 팩토리 패턴은 특정 유형의 객체를 만드는 데 사용됩니다. 전략 패턴은 특정 방식으로 작업 (또는 작업 집합)을 수행하는 데 사용됩니다. 고전적인 예에서, 팩토리는 다른 유형의 동물을 생성 할 수 있습니다 : 개, 고양이, 호랑이. 전략 패턴은 특정 동작 (예 : 이동; 달리기, 걷기 또는 로페 전략 사용.

실제로 두 가지를 함께 사용할 수 있습니다. 예를 들어, 비즈니스 오브젝트를 작성하는 팩토리가있을 수 있습니다. 지속성 매체에 따라 다른 전략을 사용할 수 있습니다. 데이터가 XML로 로컬로 저장된 경우 하나의 전략을 사용합니다. 데이터가 다른 데이터베이스에서 원격 인 경우 다른 데이터베이스를 사용합니다.


답변

전략 패턴을 사용하면 클래스의 동작을 다형성으로 변경할 수 있습니다.

팩토리 패턴을 사용하면 객체 생성을 캡슐화 할 수 있습니다.

게리는 큰 지적을합니다. “콘크리트”가 아닌 추상화에 코딩 원리를 사용하는 경우 많은 패턴이 테마의 변형처럼 보이기 시작합니다.


답변

tvanfosson이 말한 것에 덧붙여서, 많은 패턴이 구현과 동일하게 보입니다. 즉, 코드에 이전에 없었던 인터페이스를 만든 다음 해당 인터페이스의 구현을 많이 작성해야합니다. 차이점은 목적과 사용 방법에 있습니다.


답변

  • 팩토리 (메소드) 패턴.

구체적인 인스턴스 만 작성하십시오. 다른 인수는 다른 오브젝트를 초래할 수 있습니다. 논리 등에 따라 다릅니다.

  • 전략 패턴.

작업을 수행하기 위해 알고리즘을 캡슐화합니다 (단계). 따라서 전략을 변경하고 다른 알고리즘을 사용할 수 있습니다.

둘 다 매우 비슷해 보이지만 목적은 다소 다르지만 한 가지 목적은 다른 것을 만드는 것이 행동을 수행하는 것입니다.

그래서. 팩토리 메소드가 고정되어 있으면 다음과 같이 할 수 있습니다.

 public Command getCommand( int operatingSystem ) {
      switch( operatingSystem ) {
           case UNIX    :
           case LINUX   : return new UnixCommand();
           case WINDOWS : return new WindowsCommand();
           case OSX     : return new OSXCommand();
       }
  }

그러나 공장에보다 고급 또는 동적 생성이 필요하다고 가정하십시오. 팩토리 메소드에 전략을 추가하고 다시 컴파일하지 않고도 전략을 변경할 수 있습니다. 전략은 런타임에 변경 될 수 있습니다.


답변

우선 단순 팩토리와 추상 팩토리의 차이점을 만들어야합니다. 첫 번째는 객체 생성을위한 팩토리 역할을하는 하나의 클래스 만있는 간단한 팩토리이며, 후자는 팩토리 인터페이스 (메소드 이름을 정의하는)에 연결 한 다음이 인터페이스를 구현하는 다른 팩토리를 호출합니다. 일부 기준에 따라 동일한 방법을 다르게 구현해야합니다. 예를 들어, 첫 번째 WindowsButtonCreationFactory (Windows 룩앤필 버튼을 생성 함)와 두 번째 LinuxButtonCreationFactory (Linux 룩앤필 버튼을 생성 함)의 두 팩토리로 구현되는 ButtonCreationFactory 인터페이스가 있습니다. 따라서이 두 팩토리에는 구현 (알고리즘)이 다른 동일한 작성 방법이 있습니다.

예를 들어 Linux 모양 및 느낌의 버튼이 필요한 경우 :

ButtonCreationFactory myFactory = new LinuxButtonCreationFactory();
Button button1 = myFactory.createButton(...);

또는 Windows 버튼을 원하는 경우

ButtonCreationFactory myFactory = new WindowsButtonCreationFactory();
Button button1 = myFactory.createButton(...);

정확하게이 경우, 일부 생성을위한 알고리즘을 차별화하기 때문에 일종의 전략 패턴이됩니다. 그러나 운영 알고리즘이 아닌 OBJECT CREATION에 사용되므로 의미 적으로 다릅니다. 따라서 기본적으로 추상 팩토리에서는 다른 전략을 사용하여 객체를 생성하므로 전략 패턴과 매우 유사합니다. 그러나 AbstractFactory는 생성적인 반면 전략 패턴은 작동합니다. 현명하게 구현하면 결과는 동일합니다.


답변

Factory (및 Factory가 반환 한 FactoryMethod) :

  1. 창조 패턴
  2. 상속을 기반으로
  3. 팩토리는 팩토리 메소드 (인터페이스)를 반환하고,이 메소드는 콘크리트 오브젝트를 반환합니다
  4. 새로운 콘크리트 객체를 인터페이스로 대체 할 수 있으며 클라이언트 (호출자)는 모든 구체적인 구현을 인식하지 않아야합니다.
  5. 클라이언트는 항상 인터페이스에만 액세스하며 팩토리 메소드에서 오브젝트 작성 세부 사항을 숨길 수 있습니다

wikipedia 기사javarevisited 기사를 살펴보십시오.

전략 패턴 :

  1. 행동 패턴입니다
  2. 위임을 기반으로합니다.
  3. 메소드 동작을 수정하여 오브젝트의 내장을 변경합니다.
  4. 알고리즘 계열간에 전환하는 데 사용됩니다.
  5. 런타임시 오브젝트의 동작을 변경합니다.

예:

특정 품목 (AirFare 티켓 또는 ShoppingCart 품목)에 대한 할인 전략을 구성 할 수 있습니다. 이 예에서는 7 월-12 월 동안 품목에 25 % 할인을 제공하고 Jaunary-6 월 동안 품목에 대해서는 할인을 제공하지 않습니다.

관련 게시물:

전략 패턴의 실제 예

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


답변

Oscar가 말한 내용을 확장하고 코드와 관련하여 :

getCommand는 팩토리이고 UnixCommand, WindowsCommand 및 OSXCommand 클래스는 전략입니다.