Iphone 让Factory类负责创建对象集合而不是一次创建一个对象集合,这样可以吗

Iphone 让Factory类负责创建对象集合而不是一次创建一个对象集合,这样可以吗,iphone,ios,design-patterns,factory-pattern,Iphone,Ios,Design Patterns,Factory Pattern,我正在为一家咖啡店创建一个菜单应用程序,它有4种不同口味的咖啡。 1.黑咖啡 2.意大利泡沫咖啡 3.摩卡 4.冰咖啡 我使用工厂方法来生成这些对象 + (Coffee *) getInstance:(COFFE_TYPE /*Enumeration*/):type{ Coffee *returnValue = nil; switch(type){ case Black: returnValue = new Black_Coffee();

我正在为一家咖啡店创建一个菜单应用程序,它有4种不同口味的咖啡。 1.黑咖啡 2.意大利泡沫咖啡 3.摩卡 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; } +(Coffee*)getInstance:(COFFE_TYPE/*枚举*/):TYPE{ 咖啡*返回值=零; 开关(类型){ 黑色外壳:returnValue=新的黑色咖啡(); 打破 case Cappuccino:returnValue=新Cap_Coffee(); 打破 案例摩卡咖啡:returnValue=新摩卡咖啡(); 打破 案例结冰:returnValue=新冰咖啡(); 打破 } 返回值; } 在我的客户中,我必须保留所有可用咖啡的列表。我相信没有办法了解给定基类的子类,所以我必须手动迭代所有子类,并使用工厂方法创建每个对象。一旦我喝了50种不同类型的咖啡(我会的),这会变得一团糟。因此,每次我添加一个新类型时,我都必须将它添加到工厂中,以及我的客户需要添加哪些附加项


有没有一种方法可以让我把整个逻辑转移到一个地方。因此,just factory方法只知道额外的项,我的客户端可以调用factory类本身的getAllItems并对它们进行迭代,或者我应该让客户端处理项集合(现在就是这种情况)。

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


我会用名字而不是数字(就像你现在所做的那样),但如果你想坚持使用数字,只要你在字典中使用NSNumber作为键就行。

太好了!!我当然更愿意这样做。我唯一关心的是,工厂模式在我的代码中是标准的和普遍存在的。它可以帮助其他人在另一个方面轻松识别此类的用途d人们通常会发现难以解释NSMuatableDictionary的使用(目标C也没有泛型:(……)无需阅读文档即可实现其目的。我正在考虑一个更优雅的解决方案,以便将此NSMutableDictionary封装在工厂类中?如何?抱歉,您没有领会我的意思。字典是内部的。您可以添加新的类方法来添加类型,以提供所有类型的数组(这只是字典键)等。用户看不到词典。它只是扩展了您迄今为止所做的工作。您刚才使用的工厂方法将它们保存在词典中,然后根据需要提供副本。gr8我认为工厂方法需要重新定义。我已经多次面对这个问题,但没有找到一个优雅的解决方案。谢谢这个术语“工厂方法”指的是返回同一类实例的类方法。我真正建议的是只使用一个类来做你想做的事情——所有类方法。它可能返回一些对象,但它们不需要与类的类型相同(它们可以是字典或其他对象)。在objective-c中,此模式被称为类集群,如果用户不需要知道具体类的细节,则完全可以接受。