2009-10-08 3 views
0

J'ai une classe de type usine qui crée ses produits en fonction des caractéristiques d'un autre objet. Cela signifie que j'ai besoin d'une référence à l'objet d'entrée quelque part. Je prévois de:Obtenir des objets d'entrée dans Cocoa ... Quoi de mieux le style?

A) Définir l'objet d'entrée en tant que propriété et le définir dans une méthode init personnalisée. Le propriétaire de l'usine appelle alors "initWithObject:", puis appelle "createProduct". B12) Définir les méthodes de création de l'usine afin qu'elles prennent en argument l'objet d'entrée. Ainsi, le propriétaire de l'usine inits normalement puis appelle "createProductWithObject:".

Toutes choses étant égales par ailleurs, l'une de ces méthodes est-elle préférable à l'autre du point de vue de la conception globale? La méthode A rend les choses plus simples pour moi car je n'ai pas besoin de faire en sorte que chaque méthode accepte une entrée, mais j'aimerais être sûr que je ne néglige rien.

Merci!

Répondre

1

Je pense que cela dépend complètement de la façon dont vous avez l'intention d'utiliser votre classe d'usine. S'il s'agissait d'une usine de pizza, vous pouvez utiliser l'option A dans un scénario où le style de toutes les pizzas (les produits) dépend de la valeur initiale. D'autre part, les pizzas individuelles peuvent dépendre de quelque chose que les autres pizzas de la même usine ne peuvent pas faire.

Pizza *meatLovers = [factory createPizzaWithToppings:toppings]; 

Dans ce cas, les deux options sont utilisées. Vous aurez juste besoin de décider ce qui a le plus de sens pour vos besoins.

0

Je base mon choix de savoir si la classe doit avoir une valeur pour une propriété, ou peut s'en passer. Empruntant l'idée de Cory Kilger d'exemples basés sur la nourriture, considérons une classe de hamburger. L'instance doit avoir un petit pain et une boulette:

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]; 

Mais peut avoir un certain nombre de garnitures:

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

Ou pas du tout:

//No toppings—just meat in a bun. 

Un steak ne pas tous les éléments requis, vous devez donc l'instancier sans arguments:

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

Mais vous pouvez ajouter des valeurs pour les éléments optionnels si vous voulez:

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