我正在为咖啡店创建一个菜单应用程序,它有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并迭代它们,或者我应该让我的客户端处理项目集合(现在就是这种情况)。
答案 0 :(得分:1)
我要处理的方法是创建一个静态NSMutableDictionary,当你的应用启动时,你可以使用一个新的类方法注册已知的咖啡类型。类方法将在字典上执行setObject:forKey。为客户提供一些方法,可以根据需要注册任意数量的对象,因为每个“密钥”(名称)必须是唯一的。也就是说,他甚至可以使用相同的密钥覆盖您创建的初始项目(并替换与该类型相关联的任何对象。
我会使用名字而不是数字(就像你现在一样),但如果你想坚持使用数字,只要你在字典中使用NSNumber作为密钥就可以了。