web-dev-qa-db-ja.com

JavaコアライブラリのGoFデザインパターンの例

私はGoF Java Design Patternsを学んでいます、そしてそれらのいくつかの実際の例を見たいです。 Javaのコアライブラリにあるこれらのデザインパターンの良い例は何ですか?

672
unj2

多くのデザインパターンの概要は、 Wikipedia にあります。また、GoFが言及しているパターンについても言及しています。ここでそれらを要約し、Java SEとJava EE APIの両方にあるパターン実装をできるだけ多く割り当てようとします。


創造的なパターン

抽象ファクトリー (ファクトリ自体を返す作成メソッドによって認識可能であり、これは別の抽象/インターフェイスタイプを作成するために使用できます)

ビルダー (インスタンス自体を返す作成メソッドによって認識可能)

ファクトリーメソッド (抽象/インターフェース型の実装を返す作成メソッドによって認識可能)

プロトタイプ (同じプロパティを持つ自身のdifferentインスタンスを返す作成メソッドによって認識可能)

シングルトン (毎回同じインスタンス(通常はそれ自体)を返す作成メソッドによって認識可能)


構造パターン

アダプター different abstract/interface typeのインスタンスを取り、指定されたインスタンスをdecorates/overridesする独自/別のabstract/interface typeの実装を返す作成メソッドによって認識可能)

ブリッジ 異なる抽象/インターフェイスタイプのインスタンスを取得し、指定されたインスタンスを委任/使用する抽象/インターフェイスタイプの実装を返す作成メソッドによって認識可能)

  • まだ思い浮かぶものはありません。架空の例はnew LinkedHashMap(LinkedHashSet<K>, List<V>)で、これはアイテムを複製しないが変更不可能なリンクされたマップを返しますが、を使用します。ただし、 Java.util.Collections#newSetFromMap() および singletonXXX() メソッドは近くなります。

コンポジット same abstract/interface typeのインスタンスをツリー構造に取り込む動作メソッドによって認識可能)

デコレーター (追加の動作を追加する同じ抽象/インターフェイスタイプのインスタンスを取る作成メソッドによって認識可能)

ファサード (内部的にdifferent独立した抽象/インターフェース型のインスタンスを使用する動作メソッドによって認識可能)

フライウェイト (キャッシュされたインスタンスを返す作成メソッドによって認識可能、少し「マルチトン」のアイデア)

プロキシ (順番にデリゲート/使用 a 異なる与えられた抽象/インターフェース型の実装である与えられた抽象/インターフェース型の実装を返す作成メソッドによって認識可能)


行動パターン

責任の連鎖 (キュー内のsame abstract/interface typeのanother実装で同じメソッドを(間接的に)呼び出す動作メソッドによって認識可能)

コマンド (作成中にコマンド実装によってカプセル化されたされた異なる抽象/インターフェイスタイプの実装でメソッドを呼び出す抽象/インターフェイスタイプの動作メソッドによって認識可能)

通訳者 (与えられたインスタンス/タイプの構造的に異なるインスタンス/タイプを返す振る舞いメソッドによって認識可能;構文解析/フォーマットはパターンの一部ではなく、パターンとそれを適用する方法を決定することに注意してください)

イテレータ (キューからdifferentタイプのインスタンスを順次返す動作メソッドによって認識可能)

メディエーター (特定のインスタンスを委任/使用する異なる抽象/インターフェイスタイプのインスタンス(通常はコマンドパターンを使用)を取得する動作メソッドによって認識可能)

メメント wholeインスタンスの状態を内部的に変更する動作メソッドによって認識可能)

オブザーバー(またはパブリッシュ/サブスクライブ) (独自の状態に応じて、another abstract/interface typeのインスタンスのメソッドを呼び出す動作メソッドによって認識可能)

状態 (外部から制御できるインスタンスの状態に応じて動作を変更する動作メソッドによって認識可能)

戦略 (抽象/インターフェース型の動作メソッドにより認識され、異なる抽象/インターフェース型の実装でメソッドを呼び出します。これは、戦略実装へのメソッド引数として渡されたでした)

テンプレートメソッド (抽象型によって定義された「デフォルト」動作をすでに持っている動作メソッドによって認識可能)

訪問者 (それぞれother abstract/interface typeを取るメソッドが定義されている2つのdifferent abstract/interface typeで認識できます。一方は実際に他方のメソッドを呼び出し、もう一方は目的のメソッドを実行しますその戦略)

3101
BalusC
  1. スイング全体を通しての観測者パターン(ObservableObserver
  2. MVCもスイング中
  3. アダプター・パターン:InputStreamReaderおよびOutputStreamWriter注:ContainerAdapterComponentAdapterFocusAdapterKeyAdapterMouseAdapter not adaptersです。それらは実際にはNULLオブジェクトです。 Sunによる不適切な命名の選択.
  4. デコレータパターン(BufferedInputStreamFilterInputStreamのような他のストリームを装飾することができます)
  5. AWT ToolkitとSwingプラグイン可能なルックアンドフィールクラスのAbstractFactoryパターン
  6. Java.lang.Runtime#getRuntime()はシングルトンです
  7. メディエータパターンのButtonGroup
  8. ActionAbstractActionは、同じコードを実行するために異なる視覚的表現に使用できます - >コマンドパターン
  9. Flyweightパターン用のJTableのInterned StringsまたはCellRender(さまざまなプールについても考えます - スレッドプール、接続プール、EJBオブジェクトプール - Flyweightは実際には共有リソースの管理についてです)
  10. Java 1.0イベントモデルは、サーブレットフィルタと同様に、一連の責任の一例です。
  11. Collections Frameworkのイテレータパターン
  12. AWT/Swingの入れ子コンテナはコンポジットパターンを使用
  13. AWT/Swingのレイアウトマネージャは戦略の一例です

そしてもっとたくさん

102
jitter
  1. フライ級 Byte、Short、Integer、Long、およびStringの一部の値とともに使用されます。
  2. ファサード 多くの場所で使用されていますが、最も明白なものはScripting interfacesです。
  3. シングルトン - Java.lang.Runtimeが思い浮かぶ。
  4. 抽象的なファクトリー - スクリプティングおよびJDBC APIも。
  5. コマンド - TextComponentの元に戻す/やり直し。
  6. 通訳 - RegEx(Java.util.regex.)およびSQL(Java.sql。 )API。
  7. プロトタイプ - このカウントが100%であるかどうかはわからないが、私はclone()メソッドがこの目的のために使用できると思う。
48
NawaMan

RMIはプロキシに基づいています。

GoFの23のパターンのほとんどについて1つを挙げることが可能であるべきです:

  1. Abstract Factory:ドライバが登録されると、Java.sqlインタフェースはすべてJDBC JARから具体的な実装を取得します。
  2. ビルダー:Java.lang.StringBuilder。
  3. ファクトリメソッド:XMLファクトリなど.
  4. プロトタイプ:おそらくclone()ですが、私はそれを購入しているのかわかりません。
  5. シングルトン:Java.lang.System
  6. アダプタ:Java.awt.eventのアダプタクラス、例えばWindowAdapter。
  7. ブリッジ:Java.utilのコレクションクラス。 ArrayListによって実装されたリスト。
  8. コンポジット:Java.awt Java.awt.Component + Java.awt.Container
  9. デコレータ:Java.ioパッケージ全体。
  10. Facade: ExternalContext Cookie、セッションスコープ、および同様の操作を実行するためのファサードとして機能します。
  11. Flyweight:整数、キャラクターなど.
  12. プロキシ:Java.rmiパッケージ
  13. 責任の連鎖:サーブレットフィルタ
  14. Command:Swingメニュー項目
  15. インタプリタ:直接JDKにはありませんが、JavaCCは確かにこれを使用します。
  16. イテレーター:Java.util.Iteratorインターフェース。それ以上ははっきりしない。
  17. メディエータ:JMS?
  18. メメント:
  19. オブザーバ:Java.util.Observer/Observable(ただし、うまくいっていない)
  20. 状態:
  21. 戦略:
  22. テンプレート:
  23. ビジター:

私は23のうち10のJavaの例を考えることはできませんが、私は明日より良いことができるかどうか見ます。それがeditの目的です。

40
duffymo

Abstract Factoryパターンはさまざまな場所で使用されています。例:DatagramSocketImplFactoryPreferencesFactory。もっとたくさんあります---名前に "Factory"という単語を含むインターフェースをJavadocで検索してください。

Factoryパターンの実例もかなりあります。

26
uckelman

私はこれとはちょっと壊れた時計のようですが、Java XML APIはFactoryをよく使用します。これを見ているだけです。

Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(source);
String title = XPathFactory.newInstance().newXPath().evaluate("//title", doc);

...などなど.

さらに、さまざまなバッファ(StringBuffer、ByteBuffer、StringBuilder)がBuilderを使用しています。

21
Esko

Java.util.Collection#イテレータはファクトリメソッドの良い例です。使用しているCollectionの具象サブクラスに応じて、Iterator実装が作成されます。 Factoryスーパークラス(Collection)と作成されたIteratorはどちらもインタフェースであるため、AbstractFactoryと混同されることがあります。受け入れられた答え(BalusC)のAbstractFactoryの例のほとんどは Factory の例です。これはFactory Methodの簡易版で、元のGoFパターンの一部ではありません。 Facoryでは、Factoryクラスの階層は折りたたまれており、ファクトリは他の方法で返品する商品を選択します。

  • 抽象的なファクトリー

抽象ファクトリには複数のファクトリメソッドがあり、それぞれが異なる製品を作成します。 1つの工場で生産された製品は、一緒に使用することを目的としています(プリンタとカートリッジは同じ(抽象的な)工場から入手することをお勧めします)。上記の回答で述べたように、プラットフォームごとに異なるAWT GUIコンポーネントのファミリーはその一例です(ただし、その実装はGofで説明されている構造とは異なります)。

20
Catweazle