包装库 - 使用POCO的Builder vs Factory

时间:2009-07-10 07:12:14

标签: c# design-patterns api builder

我目前正在努力为我正在研究的.NET COM包装器项目确定一个良好的API布局,因此陷入困境之中。这主要是一个设计问题,什么会更好。

所以我有这个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 个答案:

答案 0 :(得分:1)

我相信您可以组合Builder和Factory模式,然后您可以在Refactoring Pattern书中应用“Unify接口与适配器”。如果我出错方向,请纠正我。如您所述,您将基于Point(?)创建复杂的不同对象。

您可以创建AbstractBuilder作为顶级构建器,AbstractBuilder的每个子类将负责使用公共接口(可能是COMPoint接口)创建复杂对象。

之后,您可以应用Factory模式从子类AbstractBuilder创建对象。如果使用不同的对象,则每个点对象可以是COMPoint接口或实现不同接口的适配器对象。

我希望它有所帮助。