0

我是 OOP 和设计模式的新手。

我有一个简单的应用程序来处理表、列(属于表)、行(属于列)和值(属于行)的生成。这些对象中的每一个都可以是 Property 的集合,而 Property 又被定义为枚举。

它们都是接口:我使用工厂来获取这些产品的具体实例。

现在我面临扩展这些类的问题。假设我需要另一个名为“SpecialTable”的产品,它又具有一些特殊属性或新方法,如“getSomethingSpecial”或一组扩展的属性。唯一的方法是扩展/专门化我的所有元素(即构建一个 SpecialTableFactory、一个 SpecialTable 接口和一个 SpecialTableImpl 具体)?假设我仍然想使用像 addRow(column, name) 这样不需要继承的标准方法......

我不喜欢继承工厂和接口的想法,但由于 SpecialTable 有更多方法,我猜它不能共享同一个工厂。我错了吗?

另一个问题:如果我需要在运行时定义产品属性(升级为 SpecialTable 的表),我想我应该使用装饰器。是否有可能(以及如何)结合工厂和装饰设计?

4

1 回答 1

4

SpecialTable 需要自己的创建机制,所以是的,它需要自己的工厂方法(或工厂类,如果您要创建一组必须相关的项目)。

或者:您可以为您的工厂使用设计模式策略。在这种情况下,您将在运行时使用所需的创建机制配置工厂。

至于剩下的问题:

向类添加功能的三种最常见方法是:

  1. 子类化
  2. 设计模式适配器/代理,可能与自省相结合。类别确实是这种方法的一个特例。
  3. 设计模式访客

您已经考虑过子类化。

设计模式 Adaptor/Proxy 基本上是这样的:创建一个具有所需接口的新类,并通过调用现有类的实例来实现其部分(或全部)方法。

对于设计模式访问者,您在某种意义上将代理与“双重调度”结合起来。您添加的函数驻留在可以调用现有类的实例的对象中。请参阅访客模式 - 添加新的 ConcreteElement 类很难吗?例如。

战略:

它是这样工作的:

public interface MyStrategyInterface {
  public void doWork();
}

public class MyStrategyAccessPoint implements MyStrategyInterface {

  private MyStrategyInterface current;

  public MyStrategyAccessPoint(final MyStrategyInterface initial) {
    current = initial;
  }

  public void doWork() {
    current.doWork();
  }

  public void setStrategy(final MyStrategyInterface newCurrent) {
    current = newCurrent;
  }
}

如您所见,您现在可以更改在运行时使用的 MyStrategyInterface 的实际实现。这种模式通常与 Singleton 结合使用,使 MyStrategyAccessPoint 及其 doWork 方法成为静态的。

于 2012-11-26T08:07:39.810 回答