заводская модель - избегайте особых условий - PullRequest
0 голосов
/ 03 февраля 2012

Пожалуйста, помогите мне, как я могу пропустить эти условия?

Я использую фабричный шаблон.

pizza = pizzaFctory.create ('xxx'); # e.g. these types are a,b,c,d

теперь я вызываю функцию

pizza->verifySomething ('yyy');

Вот мой вопрос: аргумент 'foo' различен для разных типов (a, b, c, d).например, если аргумент create() является 'a', то аргумент verifySomething 'fooa'.Аналогично, если аргумент create() равен 'b', то аргумент verifySomething 'foob'.

Я понимаю, что могу поставить одно условие и проверить его.

  if (pizza->isTypeA)
  {
    pizza->verifySomething ('fooa');
  }

Я хочу избежать этого, если условие.Пожалуйста, скажите мне, как этого добиться.

Ответы [ 2 ]

2 голосов
/ 04 февраля 2012
public abstract Pizza
{
    public abstract bool VerifySomething( object obj );
}

public class APizza : Pizza
{
    public bool VerifySomething( object obj )
    {
        FooA foo = (FooA)obj;
        ...
    }
}

public class BPizza : Pizza
{
    public bool VerifySomething( object obj )
    {
        FooB foo = (FooB)obj;
        ...
    }
}

Если у всех типов пиццы нет метода VerifySomething, возможно, вы нарушаете принцип замены Лискова (LSP).Возможно, есть лучший способ отделить ваши классы, чтобы сделать это более очевидным.

0 голосов
/ 03 февраля 2012

Вы можете поместить аргумент для verifySomething как свойство (или метод) созданной пиццы, что-то вроде этого (в C #, но это должно быть понятно)

public abstract class Pizza
{
   public abstract string GetParameter();

   public bool VerifySomething1()
   {
      //You can use GetParameter here directly
   }

   public bool VerifySomething2(string parameter)
   {
      //The parameter is passed from the caller
   }
}

public class Capricciosa : Pizza 
{
   public override string GetParameter() {return "CapricciosaParameter";}
}

public class Vezuvio : Pizza
{
   public override string GetParameter() {return "VezuvioParameter";}
}

Pizza pizza = PizzaFactory.Create("Vesuvio");

pizza.VerifySomething1(); //parameter is gotten inside the method
pizza.VerifySomething2(pizza.GetParameter()); //the parameter is explicitly passed
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...