在我的应用中,我有多个UITableViewCell
的子类。我使用工厂类来实例化正确的类型,并将它们提供给任何需要它们的人。工厂类获取一个参数,该参数是表示单元格的数据对象。我认为这是好的,因为工厂是控制器的一部分。
Cellfactory* factory = [[Cellfactory alloc ] initWithData:data];
当数据对象与工厂类中的视图表示一起映射时,问题就出现了。我想到了两个解决方案:
为了保持字典与映射,键将是数据对象类的字符串表示,值将是负责呈现该数据对象的视图类的字符串表示。这样,当要求工厂提供基于数据对象的视图时,它将通过查看地图字典知道要实例化的类。不好的一面是,如果添加另一个数据对象,则还需要修改工厂方法(在其字典中添加新条目)
一个更灵活的解决方案,无论您添加多少新对象,都不需要修改工厂方法,就是保持视图类的名称负责在数据对象本身内呈现数据对象。但是,这会将模型与视图耦合,并且不知何时模型不能提供有关渲染的信息。
那么,这两个中哪一个是更好的长期替代方案?是否还有其他选择可以击败他们?
答案 0 :(得分:1)
您可以执行与NSValueTransformer类似的操作,并允许注册类。像+ (void)setViewClass:(Class)viewClass forDataClass:(Class)dataClass;
这更灵活,因为您可以从每个视图和数据类最简单的地方注册这些内容。它还使用Class对象而不是字符串,它更干净,更容易出错。然后,您可以构建类似于您描述的字典,但使用Class对象而不是字符串。您可以像类本身一样使用Class对象。例如。 [[viewClass alloc] init]
。
顺便说一下,你真的不需要工厂对象;您可以使用工厂方法,例如+ (UITableViewCell *)cellForData:(id)data
。