2

core私はUIコンポーネントをAbstractFactory担当するJavaライブラリを使用しています。MyApplication はコアを使用し、UI をカスタマイズします。したがって、MyApplication の起動時に、MyFactory を AbstractFactory のインスタンスとして設定します。

class AbstractFactory {
  ...
  public static AbstractFactory getInstance();
  public abstract JButon createButton();
  public abstract JLabel createLabel();
  ...
}

class MyFactory extends AbstractFactory {
   ...
}

MyApplication.startup() {
  AbstractFactory.setInstance(new MyFactory())
}

私の問題は、たとえば MyApplication で JList を作成する必要があることですが、public JList createJList()コア ライブラリを変更できないため、AbstractFactory に追加できません。

何をすればよいでしょうか?

ケース 1: 常にMyFactory.getMyFactoryInstance()MyApplication、新しい静的フィールドで呼び出します。

class MyFactory extends AbstractFactory {
   private static MyFactory myInstance = new MyFactory();
   public static getMyFactoryInstance() { return myInstance }
   ...
}

ケース 2: 常にMyFactory.getMyFactoryInstance()MyApplication を呼び出し、キャストを使用する

class MyFactory extends AbstractFactory {
   public static MyFactory getMyFactoryInstance() { 
       if (getInstance() instanceOf MyFactory) {
           return (MyFactory) getInstance();
       }
       throw Exception();
   }
   ...
}

ケース 3: 2 つのファクトリを使用します。JButtons と JLabels には AbstractFactory を使用し、JList には SomeOtherFactory を使用します。

JButton button = AbstractFactory.getInstance().createButton();
JList list = SomeOtherFactory.getInstance.createList();

ケース 4:何か良いことはありますか? 私は何かを見落としているように感じます。

4

2 に答える 2

1

AbstractFactoryメソッドを指定する抽象サブクラスを作成し、新しい抽象クラス型を返すメソッドcreateJList()を上書きします。getInstance()その後、 MyFactory クラス内にロジックを実装し、実装ではなくインターフェイス (この場合は抽象化) へのプログラミングの原則を維持できます。

コード例:

public abstract class MyAbstractFactory extends AbstractFactory {
 //you could implement AbstractFactory's abstract methods here

 public abstract JList createJList();
}

public class MyFactory extends MyAbstractFactory {
 private static MyAbstractFactory instance;

 private MyFactory() {}

 public JList createJList() {
  //implementation of method here
 }
 public static MyAbstractFactory getInstance() {
  if (instance == null) instance = new MyFactory();
  return instance;
 }
}

上記の例では遅延インスタンス化を使用しています。これは、コードが常に使用されるとは限らず、マルチスレッド アプリケーションで使用されない場合に最適です。ただし、マルチスレッドで使用する場合は、ダブルチェック ロックMyFactoryを使用して複数のスレッドを処理する次の実装を使用します。

public class MyFactory extends MyAbstractFactory {
 private volatile static MyAbstractFactory instance;

 private MyFactory() {}

 public JList createJList() {
  //implementation of method here
 }
 public static MyAbstractFactory getInstance() {
  if (instance == null) {
   syncronized(MyFactory.class) {
    if (instance == null) instance = new MyFactory();
   }
  }
  return instance;
 }
}    

どちらの実装でも、使用方法は同じままです。

使用法:

MyAbstractFactory factory = MyFactory.getInstance();
factory.createJList();
于 2011-07-20T09:44:12.260 に答える
0

さまざまなものを構築するにはさまざまなファクトリが必要なので、ジェネリックを組み込むことを検討しましたか?

interface Factory<T> {
  ...
  T create();
  ...
}

作成する必要があるすべてのタイプの型付きファクトリを用意するだけです。例えば:

class JButtonFactory implements Factory<JButton> {
    public JButton create() {
        return new JButton();
    }
}
于 2011-07-20T13:51:50.520 に答える