공장과 전략 패턴의 차이점을 설명 할 수있는 사람이 있습니까?
나를 위해 둘 다 여분의 팩토리 클래스 (공장 패턴으로 제품 객체를 만드는 것) 이외의 다른 것을보고 있습니다.
공장과 전략 패턴의 차이점을 설명 할 수있는 사람이 있습니까?
나를 위해 둘 다 여분의 팩토리 클래스 (공장 패턴으로 제품 객체를 만드는 것) 이외의 다른 것을보고 있습니다.
답변:
팩토리 패턴은 생성 패턴입니다. 전략 패턴은 운영 패턴입니다. 다시 말해 팩토리 패턴은 특정 유형의 객체를 만드는 데 사용됩니다. 전략 패턴은 특정 방식으로 작업 (또는 작업 집합)을 수행하는 데 사용됩니다. 고전적인 예에서, 팩토리는 다른 유형의 동물을 생성 할 수 있습니다 : 개, 고양이, 호랑이. 전략 패턴은 특정 동작 (예 : 이동; 달리기, 걷기 또는 로페 전략 사용.
실제로 두 가지를 함께 사용할 수 있습니다. 예를 들어, 비즈니스 오브젝트를 작성하는 팩토리가있을 수 있습니다. 지속성 매체에 따라 다른 전략을 사용할 수 있습니다. 데이터가 XML로 로컬로 저장된 경우 하나의 전략을 사용합니다. 데이터가 다른 데이터베이스에서 원격 인 경우 다른 데이터베이스를 사용합니다.
구체적인 인스턴스 만 작성하십시오. 다른 인수는 다른 오브젝트를 초래할 수 있습니다. 논리 등에 따라 다릅니다.
작업을 수행하기 위해 알고리즘을 캡슐화합니다 (단계). 따라서 전략을 변경하고 다른 알고리즘을 사용할 수 있습니다.
둘 다 매우 비슷해 보이지만 목적은 다소 다르지만 한 가지 목적은 다른 것을 만드는 것이 행동을 수행하는 것입니다.
그래서. 팩토리 메소드가 고정되어 있으면 다음과 같이 할 수 있습니다.
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) :
이 wikipedia 기사 와 javarevisited 기사를 살펴보십시오.
전략 패턴 :
예:
특정 품목 (AirFare 티켓 또는 ShoppingCart 품목)에 대한 할인 전략을 구성 할 수 있습니다. 이 예에서는 7 월-12 월 동안 품목에 25 % 할인을 제공하고 Jaunary-6 월 동안 품목에 대해서는 할인을 제공하지 않습니다.
관련 게시물:
Oscar가 말한 내용을 확장하고 코드와 관련하여 :
getCommand는 팩토리이고 UnixCommand, WindowsCommand 및 OSXCommand 클래스는 전략입니다.
코드 나 분류를 보면 차이를 이해할 수 없습니다. GoF 패턴을 올바르게 파악하려면 의도를 찾으십시오.
전략 : "알고리즘 제품군을 정의하고 각 알고리즘을 캡슐화 한 후 상호 교환 가능하게합니다. 전략을 사용하면 알고리즘을 사용하는 클라이언트와 알고리즘이 서로 다릅니다."
팩토리 메소드 : "객체를 생성하기위한 인터페이스를 정의하지만 서브 클래스가 인스턴스화 할 클래스를 결정하도록합니다. 팩토리 메소드를 사용하면 클래스가 서브 클래스에 대한 인스턴스화를 지연시킬 수 있습니다."
다음은이 두 패턴의 의도와 차이점에 대한 자세한 설명입니다. 팩토리 방법과 전략 디자인 패턴의 차이점
팩토리 구현에 대한 그의 예제가 다소 밀접하게 결합되어 있으며 매우 폐쇄적이라는 점에서 오스카와 씨름 할 수 있습니다. 팩토리 구현은 인스턴스화되는 고정 된 특정 클래스 수에 의존해서는 안됩니다. 예를 들면 다음과 같습니다.
public Command getCommand( int operatingSystem ) {
return commandTable.get(operatingSystem);
}
...
public class WindowsCommand implements Command {
...
static {
CommandTable.getInstance().registerCommand(WIN_COMMAND_ID, new WindowsCommand());
}
}
하나 또는 다른 하나를 선택하는 가장 적절한 기준은 대부분 클래스와 메서드의 이름을 지정하는 데 사용되는 용어 일 것입니다. 우리 모두는 클래스가 아닌 인터페이스에 프로그래밍하는 경향이 있고 목표에 중점을 두어야합니다. 런타임에 실행할 코드 즉, 두 패턴 중 하나를 사용하여 목표를 달성 할 수 있습니다.
팩토리 패턴은 생성 된 패턴이며 지정된 속성 (동작)으로 생성됩니다. 생성 후 런타임에 속성 (동작)을 변경하지 마십시오. 따라서 다른 속성 (행동)이 필요한 경우 객체를 삭제하고 필요한 속성 (행동)으로 새 객체를 만들어야합니다. 똥이 아닙니다. 전략 패턴의 경우 u는 런타임에 속성 (동작)을 변경할 수 있습니다.