2010-01-07 55 views
3

有时我们设计多个算法来获得相同的结果。例如,我编写了一个将数据存储在树中的类,另一个类存储了大致相同的数据,例如链接列表。使用类/方法的不同实现的设计模式

我将发布一个名为ThingStore的接口(抽象类),并将其分类为TreeThingStore和ListThingStore,每个分别使用树或链接列表。因为我发布了一个抽象类,所以我必须有人来决定使用哪个实现(EDIT:因此调用者不会在乎这个),并且我没有这个问题硬编码。我不止一次需要这个,但我已经看不清楚GoF和其他设计模式目录。最相似的模式是“策略”模式,但它实现了多种目标。

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

回答

3

你会指定这样的实现有点奇怪。为什么你的来电者关心你如何实现一个特定的功能?他应该关心的是,您的数据存储正确存储数据,而不是真正关心您使用的基础数据结构。但是,假设实现在外部表示为数据存储的不同特征(一个对于大量插入更好,而另一个对于大量读取更好)。然后,由调用者指定他们想要实例化的具体类。作为班级设计师,对于你来说,假设你知道得最好,这有点过于自负。 :)

鉴于此,您可以将对象的创建包装到Factory中,并允许您的用户指定哪些功能是重要的。你甚至可以进一步使用Inversion of Control pattern,你可以让你的调用者实例化并给你一个存储机制来使用,但是这对你正在尝试做的事情来说似乎是过度的。

+0

也许我还没有明确表态。来电者不在乎我如何实施。这正是我需要某种方式的原因,以便它创建一个对象而不关心它将使用哪种算法 – 2010-01-07 11:14:46

+0

也许一个实现是基本和免费的,您需要为另一个实现付费。 – 2017-09-05 15:18:21

0

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

工厂可能是你最亲密的模式,因为它允许类似的设计:

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

我建议你检查Bridge模式。它的目的是将抽象与其实现分离开来,以使两者可以独立变化。

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

使用Bridge pattern工厂获得您的客户感兴趣的具体实施似乎是一个合适的方法来解决您的问题。

相关问题