工厂模式 - 避免类型特定条件

时间:2012-02-03 10:31:48

标签: design-patterns factory-pattern

请帮助我如何跳过这些条件?

我正在使用工厂模式。

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

现在我调用一个函数

pizza->verifySomething ('yyy');

这是我的问题:   对于不同类型(a,b,c,d),参数'foo'是不同的。例如如果create()的参数是'a',那么verifySomething'fooa'的参数。同样,如果create()的参数为'b',则参数verifySomething'foob'。

我知道我可以放一个条件并验证它。

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

如果条件允许,我想避免这种情况。请告诉我一些实现它的方法。

2 个答案:

答案 0 :(得分:2)

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方法,那么您可能违反了Liskov替代原则(LSP)。可能有更好的方法来分离你的类,这将使这更明显。

答案 1 :(得分:0)

您可以将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