0

目前,我陷入了困境,试图为我正在处理的 .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 对象的那个。

你认为这些模式中的任何一个在这种情况下有什么功劳吗?

我担心如果我有两个不同的点对象,它可能会使用户感到困惑,但是构建器模式也不是那么友好,嗯该怎么做。

当然,点对象是我必须创建的最简单的对象,还有很多对象要复杂一些。

谢谢。

4

1 回答 1

1

我相信你可以结合 Builder 和 Factory 模式,然后你可以应用Refactoring Pattern书中的“Unify interfaces with Adapter”。如果我走错方向,请纠正我。正如您所提到的,您将基于 Point(?) 创建复杂的不同对象。

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

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

我希望它有所帮助。

于 2009-07-10T18:56:33.280 回答