【发布时间】:2015-03-24 18:08:35
【问题描述】:
GoF 书中提到抽象工厂和桥接模式可以一起使用。但是,我在 GoF 书籍或互联网上都找不到任何同时使用这两种模式的示例。我确实知道如何将它们一起使用,但我对自己的方法没有信心。如果有人能提供一个很好的例子,我将不胜感激。谢谢
【问题讨论】:
标签: design-patterns bridge abstract-factory
GoF 书中提到抽象工厂和桥接模式可以一起使用。但是,我在 GoF 书籍或互联网上都找不到任何同时使用这两种模式的示例。我确实知道如何将它们一起使用,但我对自己的方法没有信心。如果有人能提供一个很好的例子,我将不胜感激。谢谢
【问题讨论】:
标签: design-patterns bridge abstract-factory
假设你去地铁买三明治。
先选面包,再选肉。
你有四种面包和四种肉可供选择。
如果不使用桥接模式,您将需要创建 16 个类来表示每种三明治。
通过桥接模式,您将整个情况分解为抽象面包接口,四个实现抽象面包接口的具体面包类,它们依赖于抽象肉实现者(部分-整体关系)。另外四个创建实现肉实现器的肉实现器。
public interface IBread
{
void GetSandWich();
}
// one of the concrete IBread Implementations
public class ItalianCheeseAndHerbBread : IBread
{
public ItalianCheeseAndHerbBread(IMeatImplentor implementor)
{
this.implementor = implementor;
}
public override void GetSandWich()
{
implementor.doSomething();
}
}
// one of the four meat implementors
public Chicken : IMeatImplementor
{
public override void doSomething(){}
}
到目前为止,我们已经有了标准的桥接模式。 但是现在情况发生了一点变化,我们需要素食三明治,所以我们需要 IVegetableImplementor,现在我们需要修改 ItalianCheeseAndHerbBread 以拥有多个构造函数。但这会破坏班级的凝聚力。我们可以做的是我们可以有一个工厂,我们可以传入这个工厂,这样 ItalianCheeseAndHerbBread 不再依赖于 IMeatImplementor 或 IVegetableImplementor,它只依赖于 IFactory。工厂将负责生产肉类或蔬菜。
这是我能想到的最好的插图。希望它可以帮助一点。 这是澄清代码的uml图。
【讨论】: