我有一个工厂类型的类,它根据另一个对象的特征创建它的产品。这意味着我需要在某处引用输入对象。我计划要么:
A)将输入对象定义为属性,并将其设置为自定义init方法。因此工厂的所有者调用“initWithObject:”,然后调用“createProduct”。
B)定义工厂的创建方法,以便它们将输入对象作为参数。因此工厂的所有者正常进入,然后调用“createProductWithObject:”。
所有其他方面相同,从整体设计的角度来看,这些方法中的一种是否优于另一种方法?方法A让事情变得简单,因为我不必让每个方法接受输入,但我想确定我没有忽略任何东西。
谢谢!
答案 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*/];