[JAVA] Was für eine Strategiemusterfabrik, kein Staat

So etwas wie eine Übersicht

Ich habe das staatliche Muster bei der Arbeit implementiert und werde es in Qiita belassen. Die verwendete Sprache war Java 8, aber die meisten Sprachen sollten es auf ähnliche Weise implementieren können.

25. Dezember 2019 Nachtrag und Korrektur

Als ich zum ersten Mal seit einem Jahr zurückblickte, stellte ich fest, dass die Unterscheidung zwischen Staat und Strategie nicht richtig getroffen wurde.

Nachdem ich etwas über Zustandsmaschinen gelernt hatte, konnte ich verstehen, warum sie Zustandsmuster genannt werden. Im folgenden Artikel wurde mir klar, dass die Benennung der Probe, die ich damals leichtfertig fand, nicht ganz angemessen war. Wenn Sie sich das Statusmuster nennen, sollte jedes Statusobjekt das Statusobjekt nach dem Statusübergang zurückgeben.

** Der Inhalt des Hauptthemas des folgenden Artikels wurde erstellt, indem der gesamte Status des vorherigen Artikels in Strategie konvertiert wurde. Ich werde den vorherigen vorerst verlassen **

Hauptthema

Wenn Sie das Strategie-Muster verwenden, benötigen Sie ein Strategie-Objekt, das jeden Prozess darstellt, und ein Objekt, das bestimmt, welche Strategie generiert werden soll. Der Prozess der Entscheidung, was generiert werden soll, wurde in Factory platziert.

//Strategie-Schnittstelle
public interface Strategy{
  void doSomething();
}
//Strategieumsetzung 1
public class StrategyImpl1 implements implements Strategy {
  public void doSomething(){
    System.out.println("Voller Strategie1-spezifischer Verarbeitung");
  }
}
//Strategieumsetzung 2
public class StrategyImpl2 implements implements Strategy {
  public void doSomething(){
    System.out.println("Voller Strategy2-spezifischer Verarbeitung");
  }
}

Es macht nicht viel Sinn, nur die Strategie vorzubereiten.

//Was ist der Vorteil des Schreibens dieses Codes?
Strategy strategy1 = new StrategyImpl1();
Strategy strategy2 = new StrategyImpl2();

Tatsächlich benötigen Sie auch eine Klasse, die eine bedingte Verzweigungsverarbeitung ausführt, die jeden Prozess verwaltet.

public class Factory{
    //Ich denke es ist statisch
    public Strategy create(SomeCondition sc){
        if (sc.something1) {
            //Tatsächlich dauert es ungefähr zwei Schritte, um ein Objekt zu erstellen.
            return new StateImpl1();
        } else if(sc.something2) {
            return new StateImpl2();
        }
    }
}

Daher kann der Anrufer schreiben:

Factory factory = new Factory();

for(SomeCondition sc: List<SomeCondition> scs) {
  Strategy strategy = factory.create(sc);
  strategy.doSomething();
}

In diesem Beispiel ist die switch-Anweisung ausreichend, daher macht sie nicht viel Sinn, sondern macht sie nur nutzlos kompliziert. Wenn die bedingte Verzweigung unangenehm kompliziert ist und aufgrund des Urteils viele leicht unterschiedliche Prozesse durchgeführt werden müssen, werden die Aussichten (jetzt) erheblich besser.

Es ist schwierig, die Anzahl der Klassendateien zu erhöhen, aber Menschen können nicht an zu viele oder komplizierte Dinge gleichzeitig denken, deshalb teilen wir sie in Klassen ein, um die Menge zu reduzieren, die wir sofort verstehen müssen.

Altes Hauptthema

Wenn Sie das Statusmuster verwenden, benötigen Sie ein Statusobjekt, das jeden Status darstellt, und ein Objekt, das bestimmt, welcher Status generiert werden soll. Der Prozess der Entscheidung, was generiert werden soll, wurde in Factory platziert.

//Zustandsschnittstelle
public interface State{
  void doSomething();
}
//Staatliche Umsetzung 1
public class StateImpl1 implements implements State {
  public void doSomething(){
    System.out.println("Voll von Zustand 1 spezifische Verarbeitung");
  }
}
//Staatliche Umsetzung 2
public class StateImpl2 implements implements State {
  public void doSomething(){
    System.out.println("Voll von State 2-spezifischer Verarbeitung");
  }
}

Nur einen Staat vorzubereiten, macht nicht viel Sinn.

//Was ist der Vorteil des Schreibens dieses Codes?
State state = new StateImpl1();
State state = new StateImpl2();

Tatsächlich benötigen Sie auch eine Klasse, die eine bedingte Verzweigung ausführt, um den Status zu verwalten.

public class Factory{
    //Ich denke es ist statisch
    public State create(SomeCondition sc){
        if (sc.something1) {
            //Tatsächlich dauert es ungefähr zwei Schritte, um ein Objekt zu erstellen.
            return new StateImpl1();
        } else if(sc.something2) {
            return new StateImpl2();
        }
    }
}

Daher kann der Anrufer schreiben:

Factory factory = new Factory();

for(SomeCondition sc: List<SomeCondition> scs) {
  State state = factory.create(sc);
  state.doSomething();
}

Recommended Posts

Was für eine Strategiemusterfabrik, kein Staat
Strategiemuster
Strategiemuster
Ich habe das Zustandsmuster und das Strategiemuster studiert
abstraktes Fabrikmuster
[Java] Strategiemuster
Entwurfsmuster ~ Zustand ~
Factory Method Pattern
Entwurfsmuster ~ Strategie ~
Abstraktes Fabrikmuster
Factory Method Muster
Entwurfsmuster ~ Fabrikmethode ~
Entwurfsmuster ~ Abstrakte Fabrik ~
Was ist ein Konstruktor?
Was ist ein Stream?
Was ist ein Servlet?
Erläutern Sie die Vorzüge des staatlichen Musters anhand des Bewertungsurteils des Films