1

標準のファクトリ メソッド設計パターンは、4 つのクラスについて話します。Creator、Product n の具体的な実装。

したがって、製品ごとに、製品を作成するメソッドを持つ対応するファクトリをインスタンス化する必要があります。

しかし、コンストラクターをプライベートとして宣言し、同じクラスのオブジェクトを作成する静的メソッドを持っているシナリオも見てきました。シングルトンで行うことに似ています。

たとえば、getByname は InetAddress の静的メソッドの 1 つで、パラメーターに応じてそのサブクラスの 1 つを返します。そして人々はそれをファクトリーメソッドと呼んでいます。

これもファクトリメソッドパターンの例ですか?パラメータまたはスイッチステートメントをデコードするメソッド内に if-else-if が含まれていますか? しかし、switch n 条件ステートメントの使用は、OO 設計の悪い慣例と見なされていませんか?

4

3 に答える 3

2

はい、これはファクトリ メソッド パターンの例です。

はい、その引数を解析し、どの種類のアドレス (どのサブクラス) をインスタンス化するかを決定します (これは、JDK に付属するメソッドのソース コードを調べることで簡単に見つけることができます)。

ある時点で、条件ステートメントを使用する必要があります。それは必ずしも悪い習慣ではありません。この場合、ファクトリ メソッドは、アドレスの解析をカプセル化し、適切なサブクラスを返すために正確に存在します。呼び出し側で行う必要はありません。悪い OO プラクティスとは、次のように書くことを強制されることです。

int addressType = InetAddress.getAddressType(address);
InetAddress ia = null;
switch (addressType) {
    case V4 : 
        ia = new Inet4Address();
        break;
    case V6 : 
        ia = new Inet6Address();
        break;
    default :
        throw new RuntimeException("bad address");
}

代わりに、このロジックはファクトリ メソッドにカプセル化されます。

于 2011-12-26T10:34:23.043 に答える
1

実際、これはAbstract Factory パターンの例です。戻り値の型が抽象であるため、パターンの抽象バージョンであることがわかっています ( aInet4Addressまたはのいずれかを取得できますInet6Address) 。

このパターンでは、条件文 ( ifs) は避けられず、どこかに行かなければならないので、問題ありません。「デザインナチス」はジャンプできます。

于 2011-12-26T10:37:55.720 に答える
0

多くの場合、スイッチは適切な設計によって回避できますが、他に選択肢がない場合もあります。システムの外部から (主にユーザーによって) 挿入された入力を解析するのが好きです。ただし、独自のシステムからの入力については、入力の種類ごとに (可能であれば) より良い設計または方法を検討する必要があります。

たとえば、この場合、IPv4 アドレスと IPv6 アドレスのどちらを扱っているかがわかっている場合は、工場に行く代わりに適切なメソッドを呼び出すことができるはずです。ファクトリメソッドしか利用できないとしたら、それは悪い設計です。

于 2011-12-26T10:36:56.937 に答える