Несколько условий и создание объекта с использованием шаблона проектирования - PullRequest
0 голосов
/ 30 октября 2019

Я изучаю шаблон проектирования, который могу реализовать для достижения той же цели, что и ниже. Тем не менее, я застрял, поскольку большинство примеров в сети довольно просты.

Я пытался взглянуть на фабричный метод или даже стратегический метод, но не могу понять, можно ли использовать какой-либо из них.

Любое предложение от гуру здесь?

def checkSomething():
   if ...:
      return True
   else:
      return False

def main(mode, state):
   if checkSomething() == False:
      if mode == False or (mode == True and state == False):
         obj_a = Class_A()
         return obj_a
      else:
         Class_B().run()
         obj_c = Class_C()
         return obj_c

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

все мои личные мысли

фабричный шаблон здесь отключен: вы не только создаете объекты, но и заставляете их делать вещи

конечный автомат отключен здесь: здесь нет перехода между состояниями

Итак, я использую шаблон стратегии ниже. Но я думаю, что вы все еще можете использовать шаблон фабрики сверху, чтобы еще больше отделить задачу создания объектов от классов стратегии.

своего рода псевдокод C # здесь:

interface IClass
{
    void Run();
}

class Class_A : IClass { ... }
class Class_B : IClass { ... }
class Class_C : IClass { ... }

interface IStrategy
{
    IClass Execute();
}

class StrategyA : IStrategy
{
    IClass IStrategy.Execute()
    {
        var obj_a = Class_A();
        return obj_a;
    }
}

class StrategyB : IStrategy
{
    IClass IStrategy.Execute()
    {
        Class_B.Run();
        var obj_c = Class_C();
        return obj_c;
    }
}


class DecisionMaker
{
    private IStrategy _strategy;

    public DecideStrategy(IStrategy strategy) => _strategy = strategy;

    public IClass ExecuteStrategy() => _strategy.Execute();
}

main()
{
    var decisionMaker = new decisionMaker();
    if conditionA
        decisionMaker.DecideStrategy(new StrategyA());
    else if conditionB
        decisionMaker.DecideStrategy(new StrategyB());

    return decisionMaker.ExecuteStrategy();
}
0 голосов
/ 31 октября 2019
  1. Вы можете вернуть пару или кортеж, где первой частью может быть некоторый enum, указывающий тип.
  2. Вы можете создать базовый класс и получить тип возвращаемого класса из общего базового класса. Здесь вам нужно, чтобы ваша программа зависела от базового класса, а не от производного типа.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...