2012-01-28 83 views
0

//抽象工厂类在抽象工厂模式中插入工厂方法的位置?

class pizzaStore 
{ 
    public: 
     vector <string> toppingsType; 

     virtual void bakePizza  (){} 
     virtual void preparePizza () 
     { 
      for (int i = 0; i < toppingsType.size(); i++) 
      { 
      addTopping (toppingsType[i]); 
      } 
     } 

     virtual void cutPizza  (){} 
     virtual void boxPizza (){} 
}; 

class xPizzaStore : public pizzaStore 
{ 
    xPizzaStore() 
    { 
     toppingsType = "1"; 
     sauceType  = "2"; 
     cheesetype  = "3"; 
    } 

    void orderPizza() 
    { 
     bakePizza(); 
     preparePizza(); 
     // xPizzaStore doesn't cut the pizza. 
     boxPizza(); 
    } 
}; 

//厂用于创建存储

pizzaStore * whichStore (string storeName) 
{ 
     pizzaStore obj = NULL; 

     if (storeName == "x") 
     { 
      obj = new xPizzaStore(); 
     } 
     else if (storeName == "y") 
     { 
      obj = new yPizzaStore(); 
     } 
     else if (storeName == "z") 
     { 
      obj = new zPizzaStore(); 
     } 

     return obj; 
} 

//工厂方法用于创建比萨饼

方法
pizzaStore * whichPizza (string pizzaName) 
{ 
     pizzaName obj = NULL; 

     if (pizzaBaseType == "x") 
     { 
      obj = new xPizzaName(); 
     } 
     else if (pizzaBaseType == "y") 
     { 
      obj = new yPizzaName(); 
     } 
     else if (pizzaBaseType == "z") 
     { 
      obj = new zPizzaName(); 
     } 

     return obj; 
} 

可以有不同类型的商店作为以及比萨饼。
这两种工厂方法应包含哪些类,为什么? 将它们包含在pizzaStore类本身中是否有意义?

+0

为什么'whichPizza'方法返回'pizzaStore *'?我猜这是一个拼写错误,而且你还没有为不同的比萨类('xPizaName','yPizzaName','zPizzaName')显示基类(例如'PizzaName',或者只是'Pizza')。我会把'whichPizza'作为基类'pizzaStore'中的虚拟方法,但是仍然可以''xPizzaStore'创建'yPizzaName'和'zPizzaName'? – 2012-01-28 12:18:03

+0

Anisha,你为什么需要将工厂方法插入类中?对我来说,将它们作为免费功能看起来很不错。 – 2012-01-28 11:28:04

回答

0

将它们包含在pizzaStore类本身中是否有意义?

,它应该是完全没有把这些方法class pizzaStorestatic方法。一般来说,我认为,根据其return类型将这种工厂方法放入class,并且pizzaStore是一个很好的选择。