Я основываю свой выбор на том, должен ли класс иметь значение для свойства или может обходиться без него.
Заимствование идеи Кори Килгера о пищевых продуктах, давайте рассмотрим класс Гамбургера. Экземпляр должен иметь булочку и пирожок:
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*/];