【问题标题】:Where to plug in the factory method in the abstract factory pattern?抽象工厂模式中的工厂方法在哪里插入?
【发布时间】:2012-01-28 11:22:22
【问题描述】:

// 抽象工厂类

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 类本身中是否有意义?

【问题讨论】:

  • Anisha,你为什么需要将工厂方法插入到一个类中?对我来说,将它们保留为免费功能似乎完全没问题。
  • 为什么whichPizza方法返回pizzaStore*?我想这是一个错字,你没有显示不同披萨类(xPizaNameyPizzaNamezPizzaName)的基类(例如PizzaName,或者只是Pizza)。我会将whichPizza 作为基类pizzaStore 中的虚拟方法,但仍然...可以xPizzaStore 创建yPizzaNamezPizzaName

标签: c++ oop design-patterns factory-pattern


【解决方案1】:

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

是的,将这些方法放在class pizzaStore 中作为static 方法应该是完全可以的。一般来说,我认为,将这种工厂方法放在基于其return 类型的class 中,pizzaStore 是一个很好的选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    相关资源
    最近更新 更多