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


답변:


226

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

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


1
`전략 패턴은 특정 방식으로 작업 (또는 작업 집합)을 수행하는 데 사용됩니다. 이는 개체에 대한 작업을 의미합니까?
OPV

32

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

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

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


25

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


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

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

  • 전략 패턴.

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

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

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

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

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


나는 당신이 여기서 올바른 지적을하고 있다고 생각하지 않습니다. 우선, 이러한 패턴의 이유 중 하나는 다형성에 유리한 조건을 피하는 것입니다. 먼저 간단한 팩토리와 추상 팩토리의 차이점을 만들어야합니다 .d 첫 번째 팩토리는 객체 생성을위한 팩토리 역할을하는 클래스가 하나만있는 간단한 팩토리입니다. 후자는 인터페이스에 연결 한 다음 호출합니다. 이 인터페이스를 구현하는 다른 팩토리는, 일부 기준에 근거 해 같은 메소드의 다른 구현을 가져야합니다. (계속)
interboy

4
이 경우에는 정확하게 일종의 전략 패턴이 발생하지만 조작보다는 OBJECT CREATION에 사용되므로 의미 적으로 다릅니다. 기본적으로 다른 전략을 사용하여 객체를 생성합니다.
interboy

2
@OscarRyz 당신은 둘 다를 설명하는 프로그램으로 답변을 업데이트 할 수 있습니까
Prakash Pandey

11

우선 단순 팩토리와 추상 팩토리의 차이점을 만들어야합니다. 첫 번째는 객체 생성을위한 팩토리 역할을하는 하나의 클래스 만있는 간단한 팩토리이며, 후자는 팩토리 인터페이스 (메소드 이름을 정의하는)에 연결 한 다음이 인터페이스를 구현하는 다른 팩토리를 호출합니다. 일부 기준에 따라 동일한 방법을 다르게 구현해야합니다. 예를 들어, 첫 번째 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는 생성적인 반면 전략 패턴은 작동합니다. 현명하게 구현하면 결과는 동일합니다.


10

Factory (및 Factory가 반환 한 FactoryMethod) :

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

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

전략 패턴 :

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

예:

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

관련 게시물:

전략 패턴의 실제 예

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


3

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

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


3

간단한 용어로 전략 패턴은 구현 클래스와 관련이없는 동작의 런타임 작성에 가깝습니다. 다른 하나는 팩토리가 구체적인 클래스 인스턴스의 런타임 작성이며 구현 된 인터페이스에 노출 된 동작 (메소드)을 사용하는 것은 사용자의 몫입니다.


2

코드 나 분류를 보면 차이를 이해할 수 없습니다. GoF 패턴을 올바르게 파악하려면 의도를 찾으십시오.

전략 : "알고리즘 제품군을 정의하고 각 알고리즘을 캡슐화 한 후 상호 교환 가능하게합니다. 전략을 사용하면 알고리즘을 사용하는 클라이언트와 알고리즘이 서로 다릅니다."

팩토리 메소드 : "객체를 생성하기위한 인터페이스를 정의하지만 서브 클래스가 인스턴스화 할 클래스를 결정하도록합니다. 팩토리 메소드를 사용하면 클래스가 서브 클래스에 대한 인스턴스화를 지연시킬 수 있습니다."

다음은이 두 패턴의 의도와 차이점에 대한 자세한 설명입니다. 팩토리 방법과 전략 디자인 패턴의 차이점


1

팩토리 구현에 대한 그의 예제가 다소 밀접하게 결합되어 있으며 매우 폐쇄적이라는 점에서 오스카와 씨름 할 수 있습니다. 팩토리 구현은 인스턴스화되는 고정 된 특정 클래스 수에 의존해서는 안됩니다. 예를 들면 다음과 같습니다.

public Command getCommand( int operatingSystem ) {        
   return commandTable.get(operatingSystem); 
}

...

public class WindowsCommand implements Command {
    ...
    static {
        CommandTable.getInstance().registerCommand(WIN_COMMAND_ID, new WindowsCommand());
    }

}

하나 또는 다른 하나를 선택하는 가장 적절한 기준은 대부분 클래스와 메서드의 이름을 지정하는 데 사용되는 용어 일 것입니다. 우리 모두는 클래스가 아닌 인터페이스에 프로그래밍하는 경향이 있고 목표에 중점을 두어야합니다. 런타임에 실행할 코드 즉, 두 패턴 중 하나를 사용하여 목표를 달성 할 수 있습니다.


1

전략과 공장은 다른 목적입니다. 전략에서는 접근 방식이 정의되어 있으며이 패턴을 사용하여 동작 (알고리즘)을 교환 할 수 있습니다. 공장으로 돌아 오면 많은 변형이 있습니다. 그러나 GO4 상태의 원래 패턴은 공장에서 객체 생성을 자식 클래스로 남겨 둡니다. 여기서 팩토리를 사용하면 관심있는 동작이 아닌 완전한 인스턴스를 교체하게됩니다.이를 통해 알고리즘이 아닌 완전한 시스템을 교체하게됩니다.


0

팩토리 패턴은 생성 된 패턴이며 지정된 속성 (동작)으로 생성됩니다. 생성 후 런타임에 속성 (동작)을 변경하지 마십시오. 따라서 다른 속성 (행동)이 필요한 경우 객체를 삭제하고 필요한 속성 (행동)으로 새 객체를 만들어야합니다. 똥이 아닙니다. 전략 패턴의 경우 u는 런타임에 속성 (동작)을 변경할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.