2014-10-26 3 views
0

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

interface ICar { 
    int getMaxSpeed(); 
} 

class Mercedes implements ICar {} 
class Ferrari implements ICar {} 
class Jauguar implements ICar {} 

Использование:

for(Spec spec : specs) { //spec will contain only a blob.. not a actual car type; I need to interpret it somehow 
    //do something here to match spec with type of car.. 
    ICar car = getSpecificCarSomehowWithoutSwitchCase(spec); 
} 

Я подумал о двух возможных способов сделать это:

  1. Использование Builder \ Abstract Factory шаблон для интерпретации и создания автомобиля (или вернуть уже существующий объект)

  2. Добавить метод «IsMe» в ICar, объединить экземпляров объектов Car и называть их параметром spec и возвращать true, если это так.

Мне нравится подход № 2, особенно потому, что я могу и хочу повторно использовать уже созданные объекты. Я посмотрел на шаблон дизайна пула объектов, но метод «checkout» не берет ключ \ crietrion для поиска объектов.

Я пропустил какой-то образец \ подход?

Заранее благодарен, -Ний.

ответ

0

Я думаю, вам нужно использовать абстрактную фабрику, кажется, что вы знаете, шаблон уже, если нет: http://en.wikipedia.org/wiki/Abstract_factory_pattern Еще один хороший сайт для C# является: http://www.dofactory.com/

Если этого не достаточно, я буду писать вы какой-то псевдо-код завтра :)

0

недавно я сделал что-то вроде этого:

foreach (var factory in availableFactories) 
{ 
    if (factory.IsSuitableFor(thisAbstractItem) 
    { 
     factory.CreateBasedOn(thisAbstractItem); 
    }; 
}; 

вызывающий спрашивает завод, если они могут справиться с т он item. Таким образом, реализация на заводе выглядит так:

public bool IsSuitableFor(AbstractBase thisAbstractItem) 
{ 
    return thisAbstractItem is anItemICanWorkWith; 
} 

Это хорошо работает для того, что мне нужно, и это приятно и просто. Интересно, можете ли вы принять идею спросить конкретные классы, если они обрабатывают конкретный случай и изменяют его для ваших нужд?

0

Похоже, вам нужен поведенческий шаблон. Я бы рассмотрел шаблон Chain Of Command (или Command), чтобы определить обработку логики, которая затем вызовет экземпляр Prototyped (многоразового использования) одного из ваших классов автомобилей.

+0

Это называется «Цепь ответственности», и я не уверен это то, что ему нужно. –

+0

Спасибо @ValentinYanakiev, но вы неверны: http://sourcemaking.com/design_patterns/command и http://www.codeproject.com/Articles/39166/Using-the-Chain-Of-Command-Design-Pattern-Concepts , Как я уже сказал, это также называется комбинацией ** Command **, и он мог бы на самом деле реализовать ее для обработки своей логики. Я не имел в виду схему цепочки ответственности, как это определено здесь: http://sourcemaking.com/design_patterns/chain_of_responsibility – Coldstar

+0

Команда представляет собой поведенческий шаблон, который предназначен для инкапсуляции действия и абстрагирования его от субъекта. Он не предназначен для создания. Для создания у вас есть шаблоны создания, такие как Factory, Abstract Factory, Builder и т. Д. –

Смежные вопросы