首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >抽象工厂与桥梁配对的一般问题

抽象工厂与桥梁配对的一般问题
EN

Software Engineering用户
提问于 2020-06-10 09:19:20
回答 1查看 240关注 0票数 1

我试图让自己熟悉设计模式,我正在阅读这一行关于不同模式之间关系的文章。不过,我没法把这件事搞清楚,

您可以使用抽象工厂和桥。当由Bridge定义的某些抽象只能用于特定的实现时,这种配对非常有用。在这种情况下,抽象工厂可以封装这些关系,并对客户端代码隐藏复杂性。

我不明白这种配对是如何工作的,如果有人能提供一些具体的例子,这将是伟大的!

链接是https://refactoring.guru/design-patterns/bridge

EN

回答 1

Software Engineering用户

发布于 2020-06-10 21:16:18

桥梁模式的目标是将一个抽象的概念与它的具体实现脱钩,这样两者就可以独立地变化。

例如,您可以想象有一个Image的抽象,可以进一步细化为BitmapImageVectorImage的抽象概念。

桥梁的思想是,抽象的概念是由其具体的实现构成的,并将其方法的要求传递给它的具体实现。

例如,在我们的示例中,我们可以想象Image公开了以下方法(注意:抽象不一定意味着抽象类):

  • Image.Draw()刚刚打电话给Image.ConcreteImage.Draw()
  • Image.DoubleSize()刚刚打电话给Image.Resize(2)
  • Image.Resize(factor)是一个抽象方法,将被BitmapImageVectorImage覆盖。

关键的目的是让具体的实现独立地变化。例如:

  • BitmapImage.Resize(factor)将调用BitmapImage.ConcreteImage.Resize(factor),因为如何操作像素以计算新像素取决于位图格式和为位图定义的一些策略。
  • VectorImage.Resize(factor)可能只是遍历图片中记录的形状,对于每一个形状,它的属性都是基于一些调整大小的转换而改变的。

例如,您可以想到B&W、灰比例尺和BitmapImage的RGB实现。VectorImage也是如此。

THe桥不是最常用的模式,这个例子纯属虚构。但是在下一次平台上有一个真实的故事。THe优势是极大的灵活性,因为它允许两个维度的变化。通常情况下,您将使用一系列实现(如我的示例中所示)(这里基于配色方案)。

如果您最终对桥有了一个很好的用例,那么真正的问题就开始了:如何在不将代码耦合到预定义的实现类的情况下创建对象?通常,答案是创建一个工厂,例如创建正确类型的抽象Image。但是,它也涉及要使用的相关实现。也许还有其他形式的相关对象,如过滤器或转换。因此,您最终可能需要创建相关对象的系列(例如抽象及其相关实现)。这正是抽象工厂的意图。

GoF给出了另一个有趣的例子(至少是在框架业务中):它们用不同类型的窗口(例如PopUp、Form、.)来说明桥梁,每个窗口都与特定于GUI的具体实现相关联(例如manager弹出和窗体、表示管理器.、XWindows.)。它们用特定于GUI的具体工厂来说明抽象工厂(用于创建windows实现)。

它们总结如下:

一个抽象的工厂,创建和配置一个特定的砖块。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/411288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档