【问题标题】:Using Abstract Factory pattern and Bridge pattern together抽象工厂模式和桥接模式一起使用
【发布时间】:2015-03-24 18:08:35
【问题描述】:

GoF 书中提到抽象工厂和桥接模式可以一起使用。但是,我在 GoF 书籍或互联网上都找不到任何同时使用这两种模式的示例。我确实知道如何将它们一起使用,但我对自己的方法没有信心。如果有人能提供一个很好的例子,我将不胜感激。谢谢

【问题讨论】:

    标签: design-patterns bridge abstract-factory


    【解决方案1】:

    假设你去地铁买三明治。

    先选面包,再选肉。

    你有四种面包和四种肉可供选择。

    如果不使用桥接模式,您将需要创建 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图。

    【讨论】:

    • 抱歉,我不明白这怎么可能是桥接模式?你或我都从根本上误解了该模式的目的。无论哪种方式,您都需要更详细地解释为什么该模式适合您的情况以及它解决了哪个问题。
    • 嗨伙计,你能看一下uml图并指出哪一部分是错的吗?也许我需要改写我的一些话。
    • @Larry,感谢您尝试回答我的问题。 Bridge 模式的目的是“将抽象与其实现分离,以便两者可以独立变化”,这是您的示例没有遵循的。例如,我们可以使用桥接模式实现队列。模式的实现位可以使用任何合适的数据结构(如数组或链表)或模式的抽象位可以用来执行队列类型操作的任何数据结构来实现队列。
    • @Larry,仅仅因为 UML 图与模式相似,它并没有成为该模式的实例。例如,状态和策略模式的 UML 图几乎相同,但它们是两种不同的模式。这都是关于意图:)
    • @Waqas 是的,你是对的。我完全同意你的意图。那么让我们谈谈我的插图的意图。正如我所说,我们可以有四种不同的面包和四种不同的肉,一个汉堡会有一种面包和一种肉,所以有 4 * 4 = 16 种不同的组合。所以这就是为什么我说不使用桥接模式,我们需要创建 16 个汉堡类来代表所有的可能性。现在我们有一个问题,如果我们再添加一种面包类型怎么办?这将导致创建另外 4 个类。桥接模式的目的是解耦抽象和实现,让它们变化
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    相关资源
    最近更新 更多