感谢您的时间!
这是一个让我很困惑的问题!这是关于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)