感谢您的时间!
这是一个让我很困惑的问题!它是关于工厂模式中组件之间的依赖关系。
原始模型
就像上面的图片一样,我们在这里得到了一个窗口工厂模型。
1.接口:IFatory IWindow,IButton,ITextBox(模型定义);
2.Implement:WindowsFactory、MacFatory(实现接口);</p>
新模式
现在,我们已经改变了旧模型。所以 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.如果有一天,我们得到一个派生自 Class MacWindow 的新类,我们必须重写这些虚拟方法以保持它们的风格相同。
解决方案 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() 方法;(呃。 .那些方法应该被定义为“公共虚拟”)
2.不再存在对具体实现的依赖,但窗口类必须注入对IFactory的依赖。让一个产品知道工厂细节的感觉并不好。
所以这里是谜题!哪种解决方案更好?还有其他方法可以解决这个问题吗?(很想知道!真的谢谢!)你能给我一些建议吗?
致谢
请允许我说“非常感谢!” 让您有时间阅读问题!