感谢您的时间!

这是一个让我很困惑的问题!这是关于Factory Pattern中组件之间的依赖关系。



原始模型



就像上面的图片一样,我们在这里有一个窗口工厂模型。

1.接口:IFatory IWindow,IButton,ITextBox(模型定义);

2.实现:WindowsFactory,MacFatory(实现接口);



新模型



现在,我们更改了旧模型。因此,IWindow具有两个名为“ CloseButton”和“ TitileBox”的属性。问题出现了:

1.何时以及如何实现这两个属性?

2.这两个属性的容器窗口应该具有相同的样式,这意味着我们只能使用WindowsStyle(Window / Button / TextBox)或MacStyle(Window / Button / TextBox)。请勿混用!



为了解决这些问题,我进行了一些试验。请检查下面的代码。

解决方案1

class MacWindow:IWindow
{
  public IButton CloseButton {get;private set;}
  public ITextBox TitleBox {get;private set;}

  public MacWindow()
  {
     this.CreateCloseButton();
     this.CreateTitleBox();
  }

  protected virtual void CreateCloseButton()
  {
     CloseButton = new MacButton();
  }

  protected virtual void CreateTitleBox()
  {
     TitleBox = new MacTextBox();
  }
}


如您所见,此解决方案不好。

1,MacWindow类必须依赖于特定的IButton / ITextBox实现(尽管它们在同一个Factory中),感觉很糟糕!

2.如果有一天,我们从MacWindow类中得到一个新的Class,我们必须重写这些虚拟方法,以使其保持相同的样式。



解决方案2

class MacWindow:IWindow
{
  public IFactory ActiveFactory{get;private set;}
  public IButton CloseButton {get;private set;}
  public ITextBox TitleBox {get;private set;}

  public MacWindow(IFactory factoy)
  {
     this.ActiveFactory=factory;
     this.CreateCloseButton();
     this.CreateTitleBox();
  }

  private void CreateCloseButton()
  {
     CloseButton = ActiveFactory.MakeButton();
  }

  private void CreateTitleBox()
  {
     TitleBox = ActiveFactory.MakeTextBox();
  }
}


这个看起来更好,但是现在很完美。

1,现在工作变得更容易了,如果我们从MacFactory派生了一个名为MacOSXFactory的新工厂,我们唯一要做的就是重写IFactory.MakeButton()和IFactory.MakeTextBox()方法;(er。 .those方法应定为“公共虚拟”)

2.对特定工具的依赖不再存在,但是窗口类必须将依赖注入到IFactory上。让产品知道有关工厂的详细信息并不容易。



所以这是难题!
哪种解决方案更好?
还有其他方法可以解决此问题吗?(急切地知道!非常感谢!)
你能给我一些建议吗?

致谢

请允许我说“非常感谢!”供您阅读问题的时间!

最佳答案

您应该在工厂内部实例化它们。

解决方案1不够好,因为实例化业务应该在一个地方实现,而这个地方在工厂内部。每个工厂中已经有MakeButton和MakeTextBox实现,可以在MakeWindow实现中调用它们,如下所示;

IWindow MakeWindow() //MacFactory's MakeWindow
{
    IWindow window = new MacWindow();
    window.TitleBox = this.MakeTextBox();
    window.CloseButton = this.MakeButton();
}


关于Single Responsibility principle,应在Factory中保留TextBoxes和Button的创建,因为Factory的职责是使用适当的业务规则创建对象。

解决方案2不够好,还因为Window不应该了解Factory。或窗口与它的创建者没有任何关系,它的任务是在屏幕上绘制窗口等。(Loose Coupling

10-01 02:17
查看更多