在Cocoa中获取输入对象......什么是更好的风格?

时间:2009-10-08 20:40:13

标签: objective-c cocoa

我有一个工厂类型的类,它根据另一个对象的特征创建它的产品。这意味着我需要在某处引用输入对象。我计划要么:

A)将输入对象定义为属性,并将其设置为自定义init方法。因此工厂的所有者调用“initWithObject:”,然后调用“createProduct”。

B)定义工厂的创建方法,以便它们将输入对象作为参数。因此工厂的所有者正常进入,然后调用“createProductWithObject:”。

所有其他方面相同,从整体设计的角度来看,这些方法中的一种是否优于另一种方法?方法A让事情变得简单,因为我不必让每个方法接受输入,但我想确定我没有忽略任何东西。

谢谢!

2 个答案:

答案 0 :(得分:1)

我认为这完全取决于您打算如何使用工厂类。如果这是披萨工厂,您可能希望在所有比萨(产品)的样式取决于初始值的情况下使用选项A.

PizzaFactory *factory = [[PizzaFactory alloc] initWithStyle:NewYorkStylePizza];

另一方面,个别比萨饼可能取决于同一工厂的其他比萨饼没有的东西。

Pizza *meatLovers = [factory createPizzaWithToppings:toppings];

在这种情况下,正在使用这两个选项。您只需要根据自己的需要决定什么是最有意义的。

答案 1 :(得分:0)

我的选择基于哪个类必须具有属性的值,或者可以没有它。

借用Cory Kilger关于以食物为基础的例子的想法,让我们考虑一个汉堡类。实例必须有一个发髻和一个小馅饼:

Patty *patty = [BeefPatty patty];
Bun *bun = [WhiteBun bun];
Hamburger *burger = [Hamburger burgerWithSinglePatty:patty bun:bun];
//Instantiation without convenience factory method
Hamburger *burger = [[[Hamburger alloc] initWithSinglePatty:patty bun:bun] autorelease];

但可以有任意数量的浇头:

[burger addToppingsObject:[LeafLettuce lettuce]];
[burger addToppingsObject:[TomatoSlice sliceWithThickness:1.0 /*cm*/]];
[burger addToppingsObject:[CheddarCheese slice]];

或者根本没有:

//No toppings—just meat in a bun.

牛排没有任何必需的元素,所以你将没有参数实例化它:

Steak *steak = [NewYorkSteak steak];
//Instantiation without convenience factory method
Steak *steak = [[[NewYorkSteak alloc] init] autorelease];

但是,如果您愿意,可以为可选元素添加值:

steak.sauce = [userSelectedSauce sauceInAmount:2.0 /*ml*/];