0

私はOOPとデザインパターンが初めてです。

テーブル、列 (テーブルに属する)、行 (列に属する)、および値 (行に属する) の生成を処理する単純なアプリがあります。これらの各オブジェクトは、列挙型として定義される Property のコレクションにすることができます。

これらはすべてインターフェイスです。これらの製品の具体的なインスタンスを取得するためにファクトリを使用しました。

現在、これらのクラスを拡張するという問題に直面しています。「SpecialTable」という別の製品が必要だとしましょう。この製品には、いくつかの特別なプロパティや、「getSomethingSpecial」などの新しいメソッドやプロパティの拡張セットがあります。唯一の方法は、すべての要素を拡張/特殊化することです (つまり、SpecialTableFactory、SpecialTable インターフェイス、および SpecialTableImpl 具象を構築します)? 継承する必要のない addRow(column, name) のような標準メソッドを引き続き使用したいとしましょう...

ファクトリとインターフェイスを継承するという考えは好きではありませんが、SpecialTable にはより多くのメソッドがあるため、同じファクトリを共有することはできないと思います。私が間違っている?

別の質問: 実行時に製品のプロパティ (SpecialTable にアップグレードされたテーブル) を定義する必要がある場合は、デコレータを使用する必要があると思います。ファクトリとデコレータの両方のデザインを組み合わせることは可能ですか?

4

1 に答える 1

4

SpecialTable には独自の作成メカニズムが必要です。そのため、独自のファクトリ メソッド (関連付ける必要があるアイテムのグループを作成する場合はファクトリ クラス) が必要になります。

別の方法: ファクトリにデザイン パターン ストラテジーを使用することもできます。その場合、実行時に目的の作成メカニズムを使用してファクトリを構成します。

残りの質問について:

クラスに機能を追加する最も一般的な 3 つの方法は次のとおりです。

  1. サブクラス化
  2. 設計パターン アダプター/プロキシー。イントロスペクションと組み合わせることもできます。カテゴリは、このアプローチの特殊なケースです。
  3. デザインパターン ビジター

すでにサブクラス化を検討しています。

設計パターン アダプター/プロキシは基本的に次のとおりです。必要なインターフェイスを持つ新しいクラスを作成し、既存のクラスのインスタンスを呼び出してそのメソッドの一部 (またはすべて) を実装します。

デザイン パターン ビジターの場合、ある意味でプロキシと「ダブル ディスパッチ」を組み合わせます。追加した関数は、既存のクラスのインスタンスを呼び出すことができるオブジェクトに存在します。Visitor パターンを参照してください- 新しい 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 に答える