Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> паттерн Factory Method, реализация 
V
    Опции темы
_Dream
Дата 16.11.2006, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 4.11.2006
Где: Там

Репутация: нет
Всего: нет



привет.
есть класс который обрабатывает входные параметры(массив) и есть классы обработчики. у каждого элемента массива присутствует некий id определяющий каким обработчиком он должен обрабатываться.
первоначально я сделал
Код

if (id == "A")
{
    AProcessor _aProcessor = new AProcessor();
    _aProcessor.Process(blabla);
}
else if (id == "B")
{
    BProcessor _bProcessor = new BProcessor();
    _bProcessor.Process(blabla);
}


но мне сказали что так делать не совсем верно потому что у нас если у 3х элементов массива будет id=A то будет создаваться 3 экземпляра класса AProcessor. а так делать не надо и надо делать в 1м.
мне надо использовать метод фабрики.
посидел почитал.. мало что понял smile 
мы работаем не с обьектом класса а с интерфейсом. то есть нам получается что надо создать интерфейс IProcessor и реализовать его во всех наших процессорах? или нет? и как вообще реализовать этот паттерн  smile 

вот например что я нашел
Код

public class Factory

{

      public static BaseClass CreateObject(int id)

      {

            BaseObect newInstance = null;

            switch(id)

            {

                  case (id_FirstChild)

                        newInstance = new FirstChild();

                        break;

                  case (id_SecondChild)

                        newInstance = new SecondChild();

                        break;

                  ...

            }

            return newInstance;

      }

}

 

...

 

int id = GetNextElementId(someSource);

BaseClass instance = Factory.CreateObject(id);



только не совсем понял если мы в моем случае будем кейсом выбирать нужный процессор то почему в этом случае не будет создаваться несокльких обьектов 1го класса??
--------------------
Noone dies a virgin. Life screws us all...
PM MAIL ICQ GTalk   Вверх
Vyacheslav
Дата 16.11.2006, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 2
Всего: 59



Вот здесь посмотрите
http://forum.vingrad.ru/index.php?showtopi...st&p=351143


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
ivashkanet
Дата 17.11.2006, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



_Dream, ИМХО, тут фабричным методом и не пахнет даже. Тут тебе поможет паттерн приспособленец:

Код

public class ProcessorFactory
{
    public static Processor GetProcessor(string ID)
    {

        // Смотрим существует ли в пуле нужный нам процессор
        if (_processorsPool.ContainsKey(ID))
        {
            return _processorsPool[ID];
        }
        else
        {
            // если нет --- создаем его
            Processor processor;

            switch (ID)
            {
                case "A":
                    processor = new AProcessor();
                    break;
                case "B":
                    processor = new BProcessor();
                    break;
                case "C":
                    processor = new BProcessor();
                    break;
                default:
                    throw new ArgumentException("Нет такого ID для процессора");
            }
            
            // Добавляем в пул
            _processorsPool.Add(ID, processor);
            return processor;
        }
    }

    private static Dictionary<string, Processor> _processorsPool;

    static ProcessorFactory()
    {
        _processorsPool = new Dictionary<string, Processor>();
    }
}

#region Processors
public abstract class Processor
{
    public abstract void Process(Object blablabla);
}

public class AProcessor : Processor
{
    public override void Process(object blablabla)
    {
        /////////////////////////
    }
}

public class BProcessor : Processor
{
    public override void Process(object blablabla)
    {
        /////////////////////////
    }
}

public class CProcessor : Processor
{
    public override void Process(object blablabla)
    {
        /////////////////////////
    }
}
#endregion


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

            Processor processor = ProcessorFactory.GetProcessor(id);
            processor.Process(blabla);

PM MAIL WWW ICQ   Вверх
_Dream
Дата 17.11.2006, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 4.11.2006
Где: Там

Репутация: нет
Всего: нет



спасибо буду разбираться!
--------------------
Noone dies a virgin. Life screws us all...
PM MAIL ICQ GTalk   Вверх
ivashkanet
Дата 17.11.2006, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(_Dream @  17.11.2006,  17:20 Найти цитируемый пост)
спасибо

Не за что  smile
Если будут вопросы --- задавай
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0456 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.