Библиотека Wrapper - Строитель против Фабрики с POCO - PullRequest
0 голосов
/ 10 июля 2009

Я сейчас застрял между молотом и наковальней, пытаясь выбрать хороший макет API для проекта оболочки .NET COM, над которым я работаю. Это в основном проблема дизайна и что будет работать лучше.

Итак, у меня есть этот COM-объект:

public class COMPoint
{
    internal COMPoint(MyComObject comobject) {}
    public SomeCollection Nodes {get; set;} 
}

Теперь, чтобы создать точечный объект в моем COM-объекте, мне нужно вызвать несколько строковых команд, и именно здесь у меня возникают проблемы с решением, куда указать это.

Теперь я подумал об использовании POCO, у которого есть свойства, и затем передал его в какой-то заводской метод, что-то вроде этого;

public class Point
{
   public SomeCollection Nodes {get;set;}
}

public class GeometryFactory
{
   public GeometryFactory(MyComObject comobject) {}
   public CreateCOMPointFrom(Point point)
   {
      // Do COM work here and return new COMPoint.
   }
}

или используя шаблон строителя, что-то вроде:

public class COMPoint
{
    internal COMPoint(MyComObject comobject) {}
    public SomeCollection Nodes {get; set;} 

   public class Builder
   {
      public Builder(MyComObject comobject) {}
      public SomeCollection Nodes {get; set;}
      public COMPoint Create()
      {
         // Do COM work here and return new COMPoint.
      }
   }
}

или их комбинация:

public class COMPoint
{
    internal COMPoint(MyComObject comobject) {}
    public SomeCollection Nodes {get; set;} 

   public class Builder
   {
      public Builder(MyComObject comobject) {}
      public SomeCollection Nodes {get; set;}
      public COMPoint Create()
      {
         // Do COM work here and return new COMPoint.
      }

      public COMPoint CreateFrom(Point point)
      {
         // Set builder properties and call.
         this.Create();
      }
   }
}

Идея использования POCO заключалась в том, чтобы люди могли создавать точечный объект, используя старый добрый

Point point = new Point()
point.Nodes <- Set nodes

передайте его вокруг своего кода, затем сконструируйте и верните тот, который возвращается к COM-объекту.

Считаете ли вы, что какой-либо из этих шаблонов имеет какой-либо кредит в этой ситуации?

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

Конечно, точечный объект - это самый простой объект, который мне нужно создать, есть намного больше объектов, которые немного сложнее.

Спасибо.

1 Ответ

1 голос
/ 10 июля 2009

Я считаю, что вы можете объединить шаблоны Builder и Factory, а затем применить «Объединить интерфейсы с адаптером» в книге Refactoring Pattern . Пожалуйста, поправьте меня, если я пойду не в том направлении. Как вы упомянули, вы собираетесь создавать сложные различные объекты на основе точки (?).

Вы можете создать AbstractBuilder как конструктор верхнего уровня, каждый подкласс AbstractBuilder будет отвечать за создание сложных объектов с общим интерфейсом (может быть интерфейсом COMPoint).

После этого вы можете применить шаблон Factory для создания объекта из подкласса AbstractBuilder. Каждый точечный объект может быть интерфейсом COMPoint или объектом адаптера, который реализует интерфейс difnet, если вы используете другой объект, который будет создан.

Надеюсь, это поможет.

...