2013-11-16 3 views
0

У меня есть класс, который облегчает обнаружение устройств HID, когда устройство обнаружено, event поднят и впоследствии обнаружен другим классом, который в конечном итоге будет отвечать за создание object для представления HID устройство. creation class создает собственный event с недавно созданным объектом HID.Шаблоны проектирования для создания объекта времени выполнения

Имея это в виду, у меня есть несколько дизайнерских запросов:

1) Я сделал некоторые исследования в «наилучшей практики» с относительно создания неизвестного числа или типа объект во время выполнения, для которого часто задается шаблон проектирования Abstract Factory. Создает ли шаблон дизайна Abstract Factory сценарий, который у меня есть, или есть что-то еще, что я должен делать?

2) Класс HidFinder вызывает событие, чтобы уведомить заинтересованных лиц (в основном класс HidCreator) о том, что устройство было обнаружено. Затем класс HidCreator вызывает событие, содержащее только что созданное устройство HID. Это похоже на правильный метод, однако подтверждение в любом случае было бы оценено.

Ниже приведен пример представленного кода.

public class HidFinder 
{ 
    public event EventHandler<HidFoundArgs> HidFoundHandler; 

    private void DeviceAdded(object sender, EventArrivedEventArgs e) 
    { 
     OnHidFoundHandler(new HidFoundArgs()); 
    } 

    protected virtual void OnHidFoundHandler(HidFoundArgs e) 
    { 
     EventHandler<HidFoundArgs> handler = this.HidFoundHandler; 
     if (handler != null) 
     { 
      handler(this, e); 
     } 
    } 
} 

public class HidCreator 
{ 
    private readonly HidFinder hidFinder; 

    public event EventHandler<IHidDevice> HidDeviceCreatedHandler; 

    public HidCreator(HidFinder hidFinder) 
    { 
     this.hidFinder = hidFinder; 
     this.hidFinder.HidFoundHandler += HidFinderOnHidFoundHandler; 
    } 

    private void HidFinderOnHidFoundHandler(object sender, HidFoundArgs hidFoundArgs) 
    { 
     // Create a new HID 
     var newHidDevice = Factory.CreateMethod(); 
     OnHidDeviceCreatedHandler(newHidDevice); 
    } 

    protected virtual void OnHidDeviceCreatedHandler(IHidDevice e) 
    { 
     EventHandler<IHidDevice> handler = this.HidDeviceCreatedHandler; 
     if (handler != null) 
     { 
      handler(this, e); 
     } 
    } 
} 

ответ

0

Это вообще выглядит хороший дизайн, но я хотел бы сделать два изменения:

  1. Factory кажется как некоторый глобальный объект, было бы лучше использовать Dependency Injection, для лучшего модульного тестирования, например.
  2. Изменить Factory.CreateMethod использовать параметры, так как мы не знаем, какое именно реализация IHidDevice будет созданы, и если мы не будем нуждаться в некоторой дополнительной информации от HidFoundArgs

кода после изменения:

public class HidCreator 
{ 
    private readonly HidFinder hidFinder; 
    private readonly IHidDeviceFactory factory; 

    public event EventHandler<IHidDevice> HidDeviceCreatedHandler; 

    public HidCreator(IHidDeviceFactory factory, HidFinder hidFinder) 
    { 
     this.factory = factory; 
     this.hidFinder = hidFinder; 
     this.hidFinder.HidFoundHandler += HidFinderOnHidFoundHandler; 
    } 

    private void HidFinderOnHidFoundHandler(object sender, HidFoundArgs hidFoundArgs) 
    { 
     // Create a new HID 
     var newHidDevice = factory.Create(HidFoundArgs.ToCreationParameters(hidFoundArgs)); 
     OnHidDeviceCreatedHandler(newHidDevice); 
    } 

    protected virtual void OnHidDeviceCreatedHandler(IHidDevice e) 
    { 
     EventHandler<IHidDevice> handler = this.HidDeviceCreatedHandler; 
     if (handler != null) 
     { 
      handler(this, e); 
     } 
    } 
} 

public interface IHidDeviceFactory 
{ 
    IHidDevice Create(HidCreationParameters parameters); 
    ... 
} 

public class HidCreationParameters 
{ 
    ... 
} 

public class HidFoundArgs 
{ 
    public static HidCreationParameters ToCreationParameters(HidFoundArgs args) 
    { 
     ... 
    } 
} 
Смежные вопросы