La fabbrica dovrebbe creare oggetti di strategia di contesto o concreti nel modello di strategia-fabbrica?

1

In un tipico modello di strategia

class Strategy
{
public:
    virtual int execute() const = 0;
}

class StrategyA : public Strategy
{
public:
    int execute() const override;
}

class StrategyB : public Strategy
{
public:
    int execute() const override;
}

class Context
{
public:
    Context() = delete;
    Context(Strategy* the_strategy);
    int execute() const;
private:
    Strategy* the_strategy_;
}

Dovrebbe essere preferibile utilizzare un Context di fabbrica con la strategia corretta iniettata

class ContextFactory
{
public:
    std::unique_ptr<Context> make(/*some parameters*/);
}

void ContextUser(/*some parameters*/)
{
    ContextFactory a_context_factory;
    auto a_context = a_context_factory.make(/*some parameters*/);
}

o Strategy di fabbrica, lasciando l'iniezione al chiamante?

class StrategyFactory
{
public:
    std::unique_ptr<Strategy> make(/*some parameters*/);
}

void ContextUser(/*some parameters*/)
{
    StrategyFactory a_strategy_factory;
    Context a_context(a_strategy_factory.make(/*some parameters*/));
}

Mi sembra che il Context factory debba essere preferito come:

  1. Meno lavoro per il chiamante.
  2. Factory può gestire la durata di oggetti Strategy .
  3. Facilita il cambiamento del design; se il modello di strategia è stato modificato in un altro progetto, ad esempio ereditarietà, il codice cliente non cambierebbe, solo la fabbrica.
posta Daniel 06.02.2015 - 10:58
fonte

1 risposta

1

Si lega la fabbrica a Context . Ecco alcuni svantaggi per la tua considerazione.

  1. Più fastidioso implementare le fabbriche.
  2. Se vuoi riutilizzare le strategie per qualcosa di diverso da Context , hai un problema.
  3. Se Context ha bisogno di una seconda strategia indipendente, hai un problema. Con una fabbrica responsabile della creazione del contesto, ora hai bisogno di fabbriche N * M, una per ciascuna combinazione di strategie.
risposta data 06.02.2015 - 11:27
fonte

Leggi altre domande sui tag