9

静的メソッドを使用したFactoryの実装を見てきました。このようなもの:

public class MyFactory {
    public static Product1 createProduct1() {}
    public static Product2 createProduct2() {}
}

p1 = MyFactory.createProduct1();
p2 = MyFactory.createProduct2();

それをAbstractFactoryと呼べるかどうかはわかりませんが、それは問題ではありません。Abstract Factoryについて私が理解しているのは、製品ファミリを簡単に変更できる柔軟性があるということです。

Factory factory = new MyFactory();  // might be a global or Singleton
p1 = factory.createProduct1();
p2 = factory.createProduct2();

MyFactoryそして、からに変更したい場合は、変更するのYourFactoryに必要な行は1行だけです。実行時に変更することもできます。しかし、それらが静的メソッドとして実装されている場合は可能ですか?静的ファクトリへのすべての呼び出しを変更する必要があります。また、実行時に決定する場合は、すべての場所でif-elseチェックを使用する必要があります。

p1 = YourFactory.createProduct1();
p2 = YourFactory.createProduct2();

では、静的メソッドを使用してファクトリを実装することの利点は何ですか?主な柔軟性を失っていませんか?私はここで何を逃しましたか?

特定の言語は想定されていないことに注意してください。どんな助けでも大歓迎です。

4

5 に答える 5

11

With static methods like that, you get some code reuse but that's about the extent of the benefit. It essentially reduces the oo pattern to a procedural paradigm. The big thing that you miss out on is changing your implementation at runtime based on context.

A singleton is only slightly better. It enables you to write your logic normally with member variables (state) and then just make a couple of tweaks to turn it into a singleton. Let's say your were doing some instance pooling in your factory, a singleton might be a good fit there. You still miss out on context though.

The most flexible pattern is to use dependency inversion, meaning your class depends on a factory abstraction and doesn't know or care if it's a singleton or not. This enables you to consider the context when supplying the concrete factory to use.

于 2011-04-18T14:56:45.930 に答える
3

new Product1()などを介してオブジェクトをインスタンス化するよりも、このファクトリを使用する利点はないと言いました。

しかし、それはまったく正しくありません。そのようなファクトリを使用する場合、基本クラスの実装を選択できます。それが実装された理由である可能性があります。たとえば、メソッドはwhereが から派生したものcreateProduct1()として実装でき、残りのコードはそのようなポリシーの決定から分離されます。柔軟性はあまりありませんが、仕事はうまくいくと思います。return new JumboProduct1();JumboProduct1Product1

現時点では他に何も考えられないため、この質問への回答を見て、そのようなセットアップの他の用途があるかどうかを確認します.

于 2011-04-18T14:56:27.837 に答える
1

ここには Abstract Factory の利点はありません。そのメソッドがBuilder- である場合のみ、いくつかの条件付きロジックをメソッドにカプセル化できますcreateProductX()

于 2011-04-18T14:59:17.407 に答える
1

taskinoor、静的メソッドの使用は、いくつかの理由から、純粋な OO プログラミングでは推奨されません。

  1. 静的メソッドで依存性注入を実現することはできません。
  2. 単体テスト ケースを記述することは非常に難しく、不可能に近い作業です。個人的には、プログラミングを始めたとき、静的メソッドを使用した UT の実装に苦労しました。

静的メソッドにはほとんど利点がないと言われていますが、実行時に同じままになる傾向があるライブラリ関数を作成している場合は、静的メソッドが適しています。

ここで抽象ファクトリの実装を見てください。抽象ファクトリを実現するために「静的」メソッドを使用する必要はないと思います。 http://www.dofactory.com/Patterns/PatternAbstract.aspx#_self1

于 2011-04-18T15:02:08.923 に答える