Получение входных объектов в Какао ... Какой стиль лучше? - PullRequest
0 голосов
/ 09 октября 2009

У меня есть класс фабричного типа, который создает свои продукты на основе признаков другого объекта. Это означает, что мне нужна ссылка на объект ввода где-то. Я планирую либо:

A) Определите входной объект как свойство и установите его в пользовательском методе init. Таким образом, владелец фабрики вызывает initWithObject:, а затем вызывает createProduct.

B) Определите методы создания фабрики, чтобы они принимали входной объект в качестве аргумента. Таким образом, владелец фабрики начинает работу нормально и затем вызывает «createProductWithObject:».

При прочих равных, один из этих методов предпочтительнее другого с точки зрения общего дизайна? Метод А упрощает мне задачу, поскольку мне не нужно заставлять каждый метод принимать входные данные, но я хотел бы быть уверен, что ничего не пропущу.

Спасибо!

Ответы [ 2 ]

1 голос
/ 09 октября 2009

Я думаю, что это полностью зависит от того, как вы собираетесь использовать свой фабричный класс. Если бы это была фабрика по производству пиццы, вы можете использовать опцию А в сценарии, где стиль всех пицц (продуктов) зависит от первоначального значения.

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

С другой стороны, отдельные пиццы могут зависеть от того, чего нет у других пицц того же завода.

Pizza *meatLovers = [factory createPizzaWithToppings:toppings];

В этом случае используются оба варианта. Вам просто нужно решить, что больше всего подходит для ваших нужд.

0 голосов
/ 10 октября 2009

Я основываю свой выбор на том, должен ли класс иметь значение для свойства или может обходиться без него.

Заимствование идеи Кори Килгера о пищевых продуктах, давайте рассмотрим класс Гамбургера. Экземпляр должен иметь булочку и пирожок:

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*/];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...