2011-12-26 8 views
1

標準ファクトリメソッド設計パターンは4つのクラスを話します。 Creator、Product n具体的な実装。JavaのInetAddressクラスの静的メソッドgetBynameは、Factoryメソッドパターンの例ですか?

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

しかし、人々がコンストラクタをプライベートとして宣言し、同じクラスのオブジェクトを作成する静的メソッドを持つシナリオも見てきました。シングルトンで何をするのと同じようなものです。

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

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

答えて

2

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

Ansはい、引数を解析し、どの種類のアドレス(どのサブクラス)をインスタンス化するかを決定します(これは、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"); 
} 

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

+0

しかし、私が見たところでは、ファクトリメソッドのパターンをすべてのUMLダイアグラムで説明すると、静的メソッドではなく、別のファクトリクラスに責任が委譲されます。 このスタイルには特定の名前がありますか? http://www.oodesign.com/factory-method-pattern.html –

+0

具体的な名前はないと思います。 http://en.wikipedia.org/wiki/Factory_method_patternには、サブクラスを返さないstaticファクトリメソッドを使用する例(Complex)が示されています。 –

0

多くの場合、スイッチは適切な設計によって回避できますが、他の選択肢がないことがあります。システムの外部から挿入された入力を解析する(ほとんどの場合、ユーザーによって)。しかし、あなた自身のシステムから来る入力については、(可能であれば)それぞれの種類の入力に対して、より良い設計や方法を考慮する必要があります。

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

1

実際にはAbstract Factory Patternの例です。戻り値の型が抽象的であるため、私たちは、このパターンで

、条件文(if秒)ので、避けられないとどこかに行かなければならない(どちらかInet4AddressまたはInet6Addressを得ることができる)、それはパターンの抽象バージョンを知っています大丈夫だよ。 "Design nazi's"はジャンプすることができます。

+2

実際、結果の型は抽象型ではありません。InetAddressは具象クラスです。コンストラクタはパッケージで保護されているため、インスタンス化できません。 –

+1

および抽象ファクトリパターンは、特定のクラスではない関連クラスのセットを作成します。 –

関連する問題