기타 답변 중 일부는 공장을 설명 할 수도 있지만 GOF 팩토리 패턴을 설명하지 않음에 유의하십시오. 내 TESTMODE 생성자로 을 확실치 않지만
지금 나는 추가 개체를 필요로하는 공장 패턴이 라인을 교체 할 그리고 내가 이 값을 전달해야 할 경우 확실입니다.
글쎄, 당신은 이런 식으로 생각할 수 있습니다 : TestMode가 아닌 MainMode가 특별한 것을하는 것입니다. 그것이하는 특별한 일은 이 실제로 무작위임을 보장하기 위해 주어진 숫자를 무시한다는 것입니다. 그것에 대해 생각하는 방식으로, 뭔가 특별한 것을하는 것이 MainMode입니다.
또는 임의성, MainMode 및 TestMode가 다르지 않은 경우에는 유사성을 하나의 클래스로 제외 할 수 있다고 생각할 수 있습니다.이 유사성은 임의의 숫자를 계산하기위한 두 가지 전략 중 하나입니다. 하나의 전략은 실제로는 무작위 적이며, 하나의 전략은 단지 하나의 값만의 무작위 범위와 함께 비뚤어 질 것입니다.
MainMode와 TestMode 사이에 다른 점이 있다고 가정 해 봅니다. 아마도 TestMode가 System.out 또는 기타 항목에 추가 디버깅을 출력 할 것입니다.
우리는 여전히 우리는 "테스트하거나 실제의 게임을하고부터. 이들은 직교 문제는"어떻게 우리가 임의성을 제공 않는다 "밖으로 인수 분해 할 수 있습니다.
을 그래서 지금 우리가 알고있는 추가하여 그 그 밖에 어떤 모드는 무작위 전략을 받아 들여야합니다. 예를 들어 표준 플랫폼 무작위가 충분히 무작위가 아니라는 말을들을 때 더 나은 무작위로 대체 할 수 있습니다.
또는 randoms의 범위가 단지 두 가지 선택으로 제한되거나 항상 1에서 0으로 대체되는 테스트를 수행하거나 각 호출에서 일부 Vecrtor 또는 Iterat의 다음 값을 리턴합니다. 또는.전체 응용 프로그램은 오직 하나 '모드를 만드는 경우 공장에 대한 필요가 없습니다,
interface RandomStrategy {
public double random();
}
public class NotSoRandom implements RandomStrategy {
private double r;
public NotSoRandom(final double r) { this.r = r; }
public double random() { return r; }
}
public class PlatformRandom implements RandomStrategy {
public double random() { return Math.random(); }
}
이제;
그래서 우리는 임의성 전략을 구축하기 위해 GOF 전략 패턴을 사용하여 동일한 클래스 유형을 반복해서 작성해야 할 때 팩토리를 사용합니다. Factory는 실제로 올바른 종류의 (하위) 클래스를 만들기위한 전략입니다.
프로덕션 코드에서 필자는 물건을 만드는 제네릭 클래스가있는 팩토리를 사용 했으므로 생성 할 올바른 서브 클래스를 만드는 방법을 알려야합니다. 나는 그것을하기 위해 공장을 지나친 다.
이제 '모드'에 대한 팩토리 패턴을 만듭니다. 그들이 사용하는 방법에 이제 당신이 공장 패턴 및 전략 패턴, 그들이 어떻게 "모양"비슷한 것에 대해 알고 그래서
abstract class Mode() {
private RandomStrategy r;
public Mode(final RandomStrategy r) { this.r = r; }
// ... all the methods a Mode has
}
public class MainMode implements Mode {
public MainMode(final RandomStrategy r) { super(r); }
}
public class TestMode implements Mode {
public TestMode(final RandomStrategy r) { super(r); }
}
interface ModeFactory{
public Mode createMode(final RandomStrategy r);
}
public class MainFactory() {
public Mode createMode(final RandomStrategy r) {
return new MainMode(r);
}
}
public class TestFactory() {
public Mode createMode(final RandomStrategy r) {
return new TestMode(r);
}
}
,하지만 서로 다른 :이 놀라 울 전략 패턴과 유사합니다 공장 Pattern은 Object Creational이며 사용할 객체를 반환합니다. 전략은 Object Behavioral이며, 인스턴스는 대개 명시 적으로 생성되며 알고리즘을 캡슐화하기 위해 인스턴스에 대한 참조가 유지됩니다. 그러나 구조 측면에서 보면 매우 유사합니다.
편집 : OP는 "GUI에 어떻게 통합합니까?"라는 질문에 OP가 묻습니다.
글쎄,이 중 아무 것도 '모드'를 제외하고 프로그램의 GUI에 속하지 않습니다. ConcreteStrategy를 생성하여 일부 설정 루틴에서 기본 설정 팩토리에 전달하여 명령 줄 인수 또는 구성 파일을 기반으로 사용할 설정을 결정할 수 있습니다. 기본적으로 원래 게시물에서 올바른 클래스를 선택하면 올바른 팩토리를 선택하게됩니다. 다시 한번 말하지만, 뭔가를 만들면 Factory가 필요하지 않습니다. 공장은 대량 생산 용 (또는 관련 콘크리트 유형의 패밀리 작성 -이 질문의 범위를 벗어나지 만). 파생 클래스 RobotOpponent 및 DragonOpponent으로) 우리는 반대 (인터페이스를 생성 OpponentFactory를 인스턴스화 할 것;
(우리는 사용자가 로봇 또는 용 싸울 여부를 명령 줄에서 선택할 수있는 게임을 가정 마찬가지로, 한 사용자가 전략으로 세운 용감한 또는 겁쟁이의 상대를 선택할 수도 있습니다. 더 많은 Strategy 인스턴스를 만들 필요가 없습니다. 전략은 보통 (비 저장 및 싱글) 나무 등입니다.)
static int main(String[] args) {
// setup game world
final RandomStrategy r = "random".equals(args[0])
? new PlatformRandom() : new NotSoRandom(Integer.intValue(args[0])) ;
// notice the simlarity to the code you originally posted;
// we factored out how to achieve "randomness" as a Strategy.
// now we will use our Strategy to setup our Factory;
final ModeFactory f = "test".equals(args[1])
? new TestFactory(r) : new MainFactory(r);
// also similar to your code
// we've just added an extra level of indirection:
// instead of creating a Mode, we've created an object that can create Modes
// of the right derived type, on demand.
// call something that uses our factory
functionThatRunsameAndNeedstoProduceModesWhenevertNeedsTo(f);
}
그러면 GUI에 어떻게 구현할 수 있습니까? –