【问题标题】:Design Pattern for using different implementations of a class/method使用类/方法的不同实现的设计模式
【发布时间】:2010-01-07 02:46:39
【问题描述】:

有时我们会设计不止一种算法来获得相同的结果。例如,我编写了一个将我的数据存储在树中的类,以及另一个将大致相同的数据存储在链表中的类。

我将发布一个名为 ThingStore 的接口(抽象类),并将其子类化为 TreeThingStore 和 ListThingStore,分别使用树或链表。

但是,由于我要发布一个抽象类,我必须有人来决定使用哪个实现(EDIT:所以调用者不会关心这个),我没有有这个硬编码的问题。我不止一次需要这个,但是我没有成功地查看过 GoF 和其他设计模式目录。最相似的模式是“策略”模式,但它实现了不同的目标。

那么,是否有针对此意图的设计模式?如果没有,有人可以创建一个或告诉我为什么不应该这样做(或获得相同结果的更好方法)?

【问题讨论】:

    标签: design-patterns oop


    【解决方案1】:

    您会指定这样的实现有点奇怪。为什么您的呼叫者关心您如何实现特定功能?他应该关心的是你的数据存储是否正确地存储了数据,而不是真正关心你使用的底层数据结构。但是,假设实现在外部表示为数据存储的不同特性(例如,一种更适合大量插入,另一种更适合大量读取)。然后,由调用者指定他们想要实例化的具体类。作为类设计者,假设你以某种方式最了解,这有点冒昧。 :)

    鉴于此,您绝对可以将对象的创建封装到 Factory 中,并允许您的用户向工厂指定哪些特性是重要的。您可以走得更远,使用Inversion of Control pattern 允许调用者实例化并为您提供存储机制以供使用,但这对于您正在尝试做的事情来说似乎有点过分了。

    【讨论】:

    • 也许我还没有说清楚。调用者不在乎我如何实现。这正是我需要某种方法来创建对象的原因,而不关心它将使用哪种算法
    • 也许一种实现是基本且免费的,而您需要为另一种实现付费。
    【解决方案2】:

    我建议您检查桥接模式。它的目的是将抽象与其实现分离,以便两者可以独立变化。

    Java API 中的集合类框架提供了几个使用桥接模式的示例。 ArrayList 和 LinkedList 具体类都实现了 List 接口。 List 接口提供了常见的抽象概念,例如添加到列表和询问其大小的能力。 ArrayList 和 LinkedList 的实现细节不同,主要是关于何时为列表中的元素分配内存。

    使用 Bridge patternFactory 来获得您的客户感兴趣的具体实现似乎是解决您的问题的合适方法。

    【讨论】:

      【解决方案3】:

      查看Factory PatternAdapter Pattern(取决于您要查找的内容)。适配器更多地用于包装现有实现,其中工厂用于从子类或复合类树中创建。

      工厂可能是您最接近的模式,因为它允许设计类似于:

      ThingStore theThingStore = ThingStoreFactory.GetStore("tree");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-01
        • 2010-11-18
        • 2017-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-18
        • 1970-01-01
        相关资源
        最近更新 更多