공장 패턴과 전략 패턴의 차이점은 무엇입니까?
공장 패턴과 전략 패턴의 차이를 설명할 수 있는 사람이 있나요?
나에게는 공장 클래스(공장 패턴으로 제품의 오브젝트를 만드는 것)가 추가되는 것 이외에는 둘 다 같아 보인다.
공장 패턴은 크레디컬 패턴입니다.전략 패턴은 동작 패턴입니다.즉, 공장 패턴을 사용하여 특정 유형의 개체를 만듭니다.전략 패턴은 특정 방법으로 조작(또는 일련의 조작)을 수행하기 위해 사용됩니다.고전적인 예에서는 공장에서 다양한 유형의 동물(개, 고양이, 호랑이)을 만들 수 있지만 전략 패턴은 특정 액션(실행, 산책 또는 로프 전략 사용)을 수행합니다.
실제로 이 두 가지를 함께 사용할 수 있습니다.예를 들어, 비즈니스 개체를 생성하는 공장이 있을 수 있습니다.지속성 매체에 따라 다른 전략을 사용할 수 있습니다.데이터가 로컬에 XML로 저장될 경우 한 가지 전략이 사용됩니다.데이터가 다른 데이터베이스에서 원격인 경우 다른 데이터베이스를 사용합니다.
전략 패턴을 사용하면 클래스의 동작을 다형적으로 변경할 수 있습니다.
공장 패턴에서는 오브젝트 작성을 캡슐화할 수 있습니다.
게리가 아주 잘 지적했어요.만약 당신이 "숙고"가 아닌 추상화에 대한 코드화 원리를 사용한다면, 많은 패턴들이 하나의 주제에 대한 변형처럼 보이기 시작합니다.
tvanfosson이 말한 것을 덧붙이자면, 구현에 관한 한 많은 패턴들이 똑같아 보입니다.즉, 코드에는 없었던 인터페이스를 많이 만들고 그 인터페이스의 실장을 많이 만듭니다.그 차이는 그들의 목적과 사용법에 있다.
우선 단순공장과 추상공장의 차이를 만들어야 한다.첫 번째는 오브젝트 작성용 팩토리로 기능하는 클래스가1개밖에 없는 단순한 팩토리입니다.한편, 후자는 팩토리인터페이스(메서드명을 정의)에 접속해, 이 인터페이스를 실장하는 다른 팩토리를 호출합니다.이러한 팩토리는, 같은 메서드의 실장이 다른 것을 기본으로 합니다.기준입니다.예를 들어 Button Creation Factory 인터페이스는 두 가지 공장에서 구현됩니다.첫 번째 Windows Button Creation Factory(Windows Look and Feel로 버튼을 작성)와 두 번째 Linux Button Creation Factory(Linux Look and Feel로 버튼을 작성)입니다.따라서 두 공장 모두 구현(알고리즘)이 다른 동일한 생성 방법을 사용하고 있습니다.원하는 버튼 입력 방법에 따라 런타임에 참조할 수 있습니다.
예를 들어 Linux look and feel 버튼이 필요한 경우:
ButtonCreationFactory myFactory = new LinuxButtonCreationFactory();
Button button1 = myFactory.createButton(...);
또는 Windows 버튼을 원하는 경우
ButtonCreationFactory myFactory = new WindowsButtonCreationFactory();
Button button1 = myFactory.createButton(...);
바로 이 경우, 이것은 일종의 전략 패턴을 낳습니다. 왜냐하면 어떤 창조를 하기 위한 알고리즘을 구별하기 때문입니다.그러나 운영 알고리즘이 아닌 OBJECT CREATION에 사용되기 때문에 의미론적으로는 다릅니다.추상 팩토리에서는 기본적으로 다양한 전략을 사용하여 객체를 만들 수 있으며, 이는 전략 패턴과 매우 유사합니다.단, Abstract Factory는 creative한 반면 Strategy 패턴은 operative합니다.구현에 있어서는 같은 결과를 얻을 수 있습니다.
공장(및 공장에서 반환된 FactoryMethod):
- 크레이셔널 패턴
- 상속 기준
- 공장에서 공장 메서드(인터페이스)를 반환하고 콘크리트 개체를 반환합니다.
- 인터페이스용으로 새로운 콘크리트 오브젝트를 대체할 수 있습니다.클라이언트(발신자)는, 모든 구체적인 실장에 주의할 필요가 없습니다.
- 클라이언트는 항상 인터페이스에만 액세스하며 공장 출하 시 메서드에서 객체 생성 세부 정보를 숨길 수 있습니다.
이 위키피디아 기사와 javarevisited 기사를 보세요.
전략 패턴:
- 행동 패턴이에요
- 위임을 기반으로 합니다.
- 메서드 동작을 수정하여 객체의 내장을 변경합니다.
- 알고리즘 패밀리를 전환하는데 사용됩니다.
- 런타임에 개체의 동작을 변경합니다.
예:
특정 항목(항공료 티켓 또는 쇼핑 카트 항목)에 대한 할인 전략을 구성할 수 있습니다.이 예에서는 7월 - 12월에 항목에 25% 할인을 제공하고 Jaunary - 6월에 해당 항목에 대해 할인 안 함을 제공합니다.
관련 투고:
- [ Factory ](메서드) 패턴.
구체적인 인스턴스만 생성하십시오.인수가 다르면 객체가 다를 수 있습니다.논리 등에 따라 다릅니다.
- 전략 패턴
알고리즘을 캡슐화하여(스텝) 액션을 수행합니다.따라서 전략을 변경하고 다른 알고리즘을 사용할 수 있습니다.
두 가지 모두 매우 비슷해 보이지만, 목적은 다소 다릅니다. 다른 한 가지 목적은 행동을 수행하는 것입니다.
Factory 메서드가 고정되어 있으면 다음과 같이 됩니다.
public Command getCommand( int operatingSystem ) {
switch( operatingSystem ) {
case UNIX :
case LINUX : return new UnixCommand();
case WINDOWS : return new WindowsCommand();
case OSX : return new OSXCommand();
}
}
다만, 공장에서는 보다 고도의 또는 동적인 작성이 필요하다고 가정합니다.공장 출하 시 방법에 전략을 추가하고 재컴파일하지 않고 변경할 수 있습니다.실행 시 전략이 변경될 수 있습니다.
오스카가 말한 내용 및 그의 코드에 대해 자세히 설명하려면:
getCommand는 공장이고 UnixCommand, WindowsCommand 및 OSXCommand 클래스는 전략입니다.
간단한 용어로 전략 패턴은 구현 클래스와 무관한 동작의 런타임 생성에 가깝습니다.한편 공장에서는 구체적인 클래스인스턴스를 런타임으로 작성하고 있으며 구현된 인터페이스에 의해 공개되는 동작(메서드)을 사용하는 것은 사용자에게 달려 있습니다.
공장 패턴은 지정된 속성(동작)을 사용하여 생성되는 회전 패턴입니다.생성 후 실행 시 속성(예:)을 변경할 수 없습니다).따라서 다른 속성(프로퍼티)이 필요한 경우 오브젝트를 삭제하고 필요한 속성(프로퍼티)을 가진 새 오브젝트를 작성해야 합니다.그건 가드가 아니야strategy pattern의 경우 실행 시 속성(프로퍼티)을 변경할 수 있습니다.
코드나 분류만으로는 차이를 알 수 없습니다.GoF 패턴을 올바르게 파악하려면 , 그 의도를 확인합니다.
전략: "알고리즘 패밀리를 정의하고 각 알고리즘을 캡슐화하여 서로 교환할 수 있도록 합니다.전략을 통해 알고리즘을 사용하는 클라이언트와는 독립적으로 변경할 수 있습니다."
공장 출하 시 메서드: "개체를 만들기 위한 인터페이스를 정의하지만 인스턴스화할 클래스는 서브클래스가 결정합니다.Factory Method에서는 클래스가 서브클래스로 인스턴스화를 연기할 수 있습니다."
여기 두 패턴의 의도 및 차이점에 대한 자세한 설명이 있습니다: 공장 방법과 전략 설계 패턴의 차이
Oscar의 공장 실장 예는 상당히 밀접하게 연결되어 있고 매우 폐쇄적이라는 점에서 언급하고 싶습니다.당신의 선택은 전략 패턴입니다.공장 출하 시 구현은 인스턴스화되는 특정 클래스의 고정 수에 의존해서는 안 됩니다.다음은 예를 제시하겠습니다.
public Command getCommand( int operatingSystem ) {
return commandTable.get(operatingSystem);
}
...
public class WindowsCommand implements Command {
...
static {
CommandTable.getInstance().registerCommand(WIN_COMMAND_ID, new WindowsCommand());
}
}
하나 또는 다른 하나를 선택하는 가장 적절한 기준은 대부분 클래스나 메서드에 이름을 붙이기 위해 사용하는 용어일 것입니다.클래스가 아닌 인터페이스에 프로그래밍하는 경향이 있고, 또 목표에 초점을 맞춰야 합니다.실행 시에 실행할 코드를 결정하는 것을 목적으로 하고 있습니다.즉, 두 가지 패턴을 모두 사용하여 목표를 달성할 수 있습니다.
전략과 팩토리는 다른 목적입니다.전략에는 접근방식이 정의되어 있으며, 이 패턴을 사용하여 동작(알고리즘)을 상호 변경할 수 있습니다.공장에는 다양한 종류가 있습니다.그러나 GO4의 원래 패턴은 공장에서의 오브젝트 작성은 자녀 클래스에 맡깁니다.이 공장에서는 관심 있는 동작이 아닌 전체 인스턴스를 교체합니다.이것에 의해, 알고리즘이 아니고, 완전한 시스템을 치환하게 됩니다.
요약:
Factory
동작은 같지만 여러 개체를 만듭니다.Strategy
동작방식이 다른 단일 오브젝트용입니다.
주요 차이점Factory Pattern
그리고.Strategy Pattern
수술이 이루어지는 곳입니다. Factory Pattern
는 작성된 오브젝트(팩토리클래스는 작성 후 작업을 완료)에 대한 조작을 실시합니다.Strategy Pattern
는 컨텍스트클래스 자체에서 동작을 수행합니다.
를 변경하려면Factory Pattern
에 대해서Strategy Pattern
팩토리 클래스에서 생성된 개체를 반환하고 컨텍스트클래스 내에 개체를 유지하며 생성된 개체에서 직접 작업을 수행하는 대신 컨텍스트클래스 내에 래퍼 메서드를 생성하여 작업을 수행합니다.
생성된 객체에 대해 작업을 수행할 수 있는지 묻는 사람이 있을 수 있지만 컨텍스트 클래스에서 수행할 래퍼를 왜 계속 만들어야 합니까?좋아, 중요한 건 수술이야 Strategy Pattern
는 전략에 따라 조작을 변경할 수 있으며 오브젝트를 변경할 필요가 없으며 오브젝트 자체를 변경하는 대신 컨텍스트오브젝트에 의존하여 다른 조작을 실행할 수 있습니다.
언급URL : https://stackoverflow.com/questions/616796/what-is-the-difference-between-factory-and-strategy-patterns
'programing' 카테고리의 다른 글
MySQL을 사용하여 타임스탬프 가져오기 (0) | 2022.09.26 |
---|---|
프로그램적으로 16진수 색상(또는 rgb 및 혼합 색상)을 밝게 또는 어둡게 합니다. (0) | 2022.09.26 |
'for' 루프 내부의 'for' 루프가 동일한 카운터 변수 이름을 사용할 수 있습니까? (0) | 2022.09.26 |
PHP의 opcode를 얻는 방법 (0) | 2022.09.26 |
도커 컨테이너에 mariaDB를 입력하는 방법 (0) | 2022.09.26 |