1

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

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

当该数据对象与其在工厂类中的视图表示进行映射时,问题就出现了。我想到了2个解决方案:

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

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

那么,这两者中哪一个是更好的长期选择?有没有其他选择可以击败他们?

4

1 回答 1

1

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

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

顺便说一句,您实际上并不需要工厂对象。您可以只使用工厂方法,例如+ (UITableViewCell *)cellForData:(id)data.

于 2013-02-03T14:30:52.720 回答