Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 将抽象工厂模式和桥接模式结合使用_Design Patterns_Bridge_Abstract Factory - Fatal编程技术网

Design patterns 将抽象工厂模式和桥接模式结合使用

Design patterns 将抽象工厂模式和桥接模式结合使用,design-patterns,bridge,abstract-factory,Design Patterns,Bridge,Abstract Factory,GoF的书提到抽象工厂和桥接模式可以一起使用。然而,无论是在GoF的书中还是在互联网上,我都找不到将这两种模式结合使用的例子。我确实有一个如何将它们结合使用的想法,但我对我的方法没有信心。如果有人能提供一个好的例子,我将不胜感激。谢谢假设你去地铁买三明治 首先你选择面包,然后你选择肉 你有四种选择的面包和四种选择的肉 如果不使用桥接模式,您将需要创建16个类来表示每种类型的三明治 使用桥接模式,您可以将整个情况分解为抽象面包接口,四个具体面包类实现抽象面包接口,它们依赖于抽象肉实现器(部分-整体

GoF的书提到抽象工厂和桥接模式可以一起使用。然而,无论是在GoF的书中还是在互联网上,我都找不到将这两种模式结合使用的例子。我确实有一个如何将它们结合使用的想法,但我对我的方法没有信心。如果有人能提供一个好的例子,我将不胜感激。谢谢

假设你去地铁买三明治

首先你选择面包,然后你选择肉

你有四种选择的面包和四种选择的肉

如果不使用桥接模式,您将需要创建16个类来表示每种类型的三明治

使用桥接模式,您可以将整个情况分解为抽象面包接口,四个具体面包类实现抽象面包接口,它们依赖于抽象肉实现器(部分-整体关系)。另外四个concreate肉类实现器实现了肉类实现器

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,现在我们需要修改意大利人奶酪面包,使其具有多个构造函数。但这会破坏班级的凝聚力。我们所能做的是,我们可以拥有一个工厂,我们可以通过这个工厂,这样意大利人就不再依赖于IMeatImplementor或IVegetableImplementor,它只依赖于IFactory。工厂将负责生产肉类或蔬菜

这是我能想到的最好的例子。希望能对你有所帮助。 下面是uml图,以澄清代码。

对不起,我不知道这是什么桥型?不是你就是我从根本上误解了这个模式的目的。无论哪种方式,您都需要更详细地解释为什么模式适合您的案例以及它解决了哪些问题。嗨,伙计,您能看一下uml图并指出哪一部分是错误的吗?也许我需要重新表述我的一些话。@Larry,谢谢你尝试回答我的问题。桥接模式的目的是“将抽象与其实现解耦,以便两者可以独立变化”,而您的示例并不遵循这一点。例如,我们可以使用桥接模式实现队列。模式的实现位可以使用任何合适的数据结构(如数组、链表或模式的抽象位可以用来执行队列类型操作的任何数据结构)来实现队列。@Larry,仅仅因为UML图类似于一个模式,它并没有将其作为该模式的实例。例如,状态模式和策略模式的UML图几乎相同,但它们是两种不同的模式。这都是关于意图:)@Waqas是的,你是对的。我完全同意你的意图。让我们来谈谈我的说明的意图。正如我所说,我们可以有四种不同的面包和四种不同的肉,一个汉堡会有一种面包和一种肉,所以有4*4=16种不同的组合。这就是为什么我说不使用桥接模式,我们需要创建16个burger类来表示所有的可能性。现在我们有一个问题,如果我们再增加一种面包会怎么样?这将导致创建4个以上的类。桥接模式的目的是将抽象和实现解耦,让它们变化