使用工厂类时的设计困境

时间:2013-02-03 14:10:12

标签: objective-c oop factory factory-pattern

在我的应用中,我有多个UITableViewCell的子类。我使用工厂类来实例化正确的类型,并将它们提供给任何需要它们的人。工厂类获取一个参数,该参数是表示单元格的数据对象。我认为这是好的,因为工厂是控制器的一部分。

Cellfactory* factory = [[Cellfactory alloc ] initWithData:data];

当数据对象与工厂类中的视图表示一起映射时,问题就出现了。我想到了两个解决方案:

  • 为了保持字典与映射,键将是数据对象类的字符串表示,值将是负责呈现该数据对象的视图类的字符串表示。这样,当要求工厂提供基于数据对象的视图时,它将通过查看地图字典知道要实例化的类。不好的一面是,如果添加另一个数据对象,则还需要修改工厂方法(在其字典中添加新条目)

  • 一个更灵活的解决方案,无论您添加多少新对象,都不需要修改工厂方法,就是保持视图类的名称负责在数据对象本身内呈现数据对象。但是,这会将模型与视图耦合,并且不知何时模型不能提供有关渲染的信息。

那么,这两个中哪一个是更好的长期替代方案?是否还有其他选择可以击败他们?

1 个答案:

答案 0 :(得分:1)

您可以执行与NSValueTransformer类似的操作,并允许注册类。像+ (void)setViewClass:(Class)viewClass forDataClass:(Class)dataClass;

这样的东西

这更灵活,因为您可以从每个视图和数据类最简单的地方注册这些内容。它还使用Class对象而不是字符串,它更干净,更容易出错。然后,您可以构建类似于您描述的字典,但使用Class对象而不是字符串。您可以像类本身一样使用Class对象。例如。 [[viewClass alloc] init]

顺便说一下,你真的不需要工厂对象;您可以使用工厂方法,例如+ (UITableViewCell *)cellForData:(id)data