是否可以使Factory类负责创建一个对象集合而不是一次创建一个对象集合

时间:2012-07-25 00:02:11

标签: iphone ios design-patterns factory-pattern

我正在为咖啡店创建一个菜单应用程序,它有4种不同口味的咖啡。  1.黑咖啡  2.卡布奇诺  摩卡  4.冰咖啡。

我使用工厂方法生成这些对象。

+ (Coffee *) getInstance:(COFFE_TYPE /*Enumeration*/):type{

   Coffee *returnValue = nil;

   switch(type){
     case Black: returnValue = new Black_Coffee();
                 break;
    case Cappuccino: returnValue = new Cap_Coffee();
                 break;
    case Mocha: returnValue = new Mocha_Coffee();
                 break;
    case Iced: returnValue = new Iced_Coffee();
                 break;

    }
    return returnValue;
}

在我的客户端,我必须保留所有可用咖啡的清单。我相信没有办法了解给定基类的子类,所以我必须手动遍历所有子类并使用工厂方法创建每个Object。一旦我有50种不同类型的咖啡(我会这样),这将变得混乱。因此,每次添加新类型时,我都必须将其添加到工厂中,我的客户端需要添加其他项目。

有没有办法可以将整个逻辑转移到一个地方。因此,只有工厂方法才能知道其他项目,我的客户端可以在工厂类本身上调用getAllItems并迭代它们,或者我应该让我的客户端处理项目集合(现在就是这种情况)。

1 个答案:

答案 0 :(得分:1)

我要处理的方法是创建一个静态NSMutableDictionary,当你的应用启动时,你可以使用一个新的类方法注册已知的咖啡类型。类方法将在字典上执行setObject:forKey。为客户提供一些方法,可以根据需要注册任意数量的对象,因为每个“密钥”(名称)必须是唯一的。也就是说,他甚至可以使用相同的密钥覆盖您创建的初始项目(并替换与该类型相关联的任何对象。

我会使用名字而不是数字(就像你现在一样),但如果你想坚持使用数字,只要你在字典中使用NSNumber作为密钥就可以了。