【问题标题】:A design dilemma when working with factory classes [closed]使用工厂类时的设计困境[关闭]
【发布时间】:2013-02-03 14:10:12
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: objective-c oop factory factory-pattern


    【解决方案1】:

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

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

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

    【讨论】:

    • 我虽然使用Class 而不是NSString,但是我不确定对它的引用是否应该是strongweakunsafe_unretained。我会说最后一个。总的来说,一个很好的答案,谢谢。尽管如此,我认为使用工厂对象是合理的,因为我可以传递它并且它可以保存有关单元类型的更多信息,具有上下文,例如在制作单元之前知道标识符。最后,如果我添加另一种类型的单元格,您的解决方案将需要更改转换器,这将其限制为与我的问题中的字典解决方案相同的限制。
    • 当然这并不意味着不好,但我希望找到类似于我提出的第二个解决方案的东西,不会将模型与视图。
    • 添加新类型的cell不需要改工厂代码;你只需为它创建一个新类,然后从你的应用程序委托或类似的地方调用[CellFactory setViewClass:[MyNewTableViewCell class] forDataClass:[MyNewDataClass class]]。 CellFactory 只是保留了一个从这些映射构建的类级别的可变字典。所以,是的,字典会改变,但工厂的代码不会改变。
    • 是的,我现在明白了。我什至可以创建一个抽象工厂,我的所有工厂方法都将从中继承。抽象工厂将拥有 所有 映射。老实说,这似乎是个好主意。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    相关资源
    最近更新 更多