gpt4 book ai didi

design-patterns - 工厂模式中组件之间的依赖

转载 作者:行者123 更新时间:2023-12-04 06:59:20 28 4
gpt4 key购买 nike

感谢您的宝贵时间!

这里有一个问题让我很困惑!它是关于工厂模式中组件之间的依赖关系。


原始模型

Window Model in Factory Pattern

就像上图一样,我们在这里得到了一个窗口工厂模型。

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

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


新模型

New Model

现在,我们改变了旧模型。所以 IWindow 有两个属性,名为“CloseButton”和“TitileBox”。问题就出来了:

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

2.这两个属性应该和它们的容器窗口有相同的样式,也就是说我们只能有WindowsStyle(Window/Button/TextBox)或者MacStyle(Window/Button/TextBox),不能混用!


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

方案一

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 派生了一个新类,我们必须重写那些虚方法以保持它们的样式相同。


解决方案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() 方法; (呃..那些方法应该定义为'public virtual')

2.不再存在对特定实现的依赖,但是窗口类必须注入(inject)对IFactory的依赖。让产品知道工厂的详细信息感觉不太好。


这就是谜题!哪种解决方案更好?还有没有其他方法可以解决这个问题?(急切想知道!真的谢谢!)你能给我一些建议吗?

致谢

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

最佳答案

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

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

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

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

解决方案 2 还不够好,因为窗口不应该知道工厂。或者一个Window与其创建者没有任何业务,它的业务是在屏幕上绘制一个窗口等(Loose Coupling)

关于design-patterns - 工厂模式中组件之间的依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19678249/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com