有时我们会设计多个算法来获得相同的结果。例如,我编写了一个将数据存储在树中的类,以及另一个在链表中存储大致相同数据的类。
我将发布一个名为ThingStore的接口(抽象类),我将它子类化为TreeThingStore和ListThingStore,每个都使用树或链表。
但是,由于我要发布一个抽象类,我必须让某人决定使用哪种实现(编辑:所以调用者不关心这个),我没有这个硬编码的问题。我不止一次需要这个,但是我不知不觉地看了GoF和其他设计模式目录。最相似的模式是“战略”模式,但它实现了不同的目标。
那么,这个意图是否有设计模式?如果没有,有人可以创建一个或告诉我为什么不应该这样做(或更好的方法来实现相同的结果)?
答案 0 :(得分:3)
你会指定类似的实现有点奇怪。为什么您的来电者关心您如何实施特定功能?他应该关心的是,您的数据存储正确地存储数据,而不是真正关心您使用的基础数据结构。但是,让我们说实现在外部表示为数据存储的不同功能(一个对于大量插入更好,一个对于大量读取更好)。然后,由调用者决定他们想要实例化哪个具体类。作为班级设计师,假设你以某种方式最了解你,这有点冒昧。 :)
鉴于此,您绝对可以将对象的创建包装到Factory中,并允许您的用户向Factory指定哪些功能很重要。您可以更进一步使用Inversion of Control pattern,允许您的调用者实例化并向您提供一个存储机制以供使用,但这似乎有点过头了。
答案 1 :(得分:2)
我建议您检查桥接模式。它的目的是将抽象与其实现分离,以便两者可以独立变化。
Java API中的集合类框架提供了几种使用桥接模式的示例。 ArrayList和LinkedList具体类都实现了List接口。 List接口提供了常见的抽象概念,例如添加到列表并询问其大小的功能。 ArrayList和LinkedList之间的实现细节有所不同,主要是关于为列表中的元素分配内存的时间。
使用带有工厂的Bridge pattern来获取客户感兴趣的具体实现,这似乎是解决问题的合适方法。
答案 2 :(得分:0)
查看Factory Pattern或Adapter Pattern(取决于您要查找的内容)。适配器更适用于包装一个exitsting实现,其中factory用于从子类树或复合类创建。
工厂可能是您最接近的模式,因为它允许设计类似于:
ThingStore theThingStore = ThingStoreFactory.GetStore("tree");