[解決済み] Java のコア・ライブラリにおける GoF デザイン・パターンの例
2022-03-15 16:27:36
質問
GoFのJavaデザインパターンを学んでいるのですが、その実例を見たいのです。Javaのコア・ライブラリで、これらのデザイン・パターンの良い例があれば教えてください。
どのように解決するのですか?
多くのデザインパターンの概要については ウィキペディア . また、GoFがどのパターンに言及しているかについても言及されています。ここでは、それらをまとめて、Java SEとJava EEの両方のAPIで見られる、できるだけ多くのパターン実装を割り当ててみることにする。
作成パターン
抽象的な工場 <サブ (ファクトリー自身を返す作成メソッドで認識でき、それを使って別の抽象型/インターフェース型を作成できる)
-
javax.xml.parsers.DocumentBuilderFactory#newInstance()
-
javax.xml.transform.TransformerFactory#newInstance()
-
javax.xml.xpath.XPathFactory#newInstance()
ビルダー <サブ (インスタンス自身を返す作成メソッドで認識可能)。
-
java.lang.StringBuilder#append()
(非同期) -
java.lang.StringBuffer#append()
(同期) -
java.nio.ByteBuffer#put()
(またCharBuffer
,ShortBuffer
,IntBuffer
,LongBuffer
,FloatBuffer
そしてDoubleBuffer
) -
javax.swing.GroupLayout.Group#addComponent()
-
のすべての実装は
java.lang.Appendable
-
java.util.stream.Stream.Builder
ファクトリーメソッド <サブ (抽象型/インターフェース型の実装を返す作成メソッドで認識可能)。
-
java.util.Calendar#getInstance()
-
java.util.ResourceBundle#getBundle()
-
java.text.NumberFormat#getInstance()
-
java.nio.charset.Charset#forName()
-
java.net.URLStreamHandlerFactory#createURLStreamHandler(String)
(プロトコル毎にシングルトンオブジェクトを返します) -
java.util.EnumSet#of()
-
javax.xml.bind.JAXBContext#createMarshaller()
およびその他の類似のメソッド
プロトタイプ <サブ (を返す作成メソッドで認識可能)。 異なる のインスタンス)
-
java.lang.Object#clone()
(このクラスはjava.lang.Cloneable
)
シングルトン <サブ (を返す作成メソッドで認識可能)。 同じ のインスタンス(通常はそれ自身)を毎回作成します。)
構造パターン
アダプタ <サブ (のインスタンスを取る作成メソッドで認識可能)。 異なる 抽象/インターフェース型の実装を返します。 を装飾/オーバーライドする 与えられたインスタンス)
-
java.util.Arrays#asList()
-
java.util.Collections#list()
-
java.util.Collections#enumeration()
-
java.io.InputStreamReader(InputStream)
(を返します)。Reader
) -
java.io.OutputStreamWriter(OutputStream)
(を返します)。Writer
) -
javax.xml.bind.annotation.adapters.XmlAdapter#marshal()
と#unmarshal()
ブリッジ <サブ (のインスタンスを取る作成方法によって認識される)。 異なる 抽象/インターフェース型の実装を返します。 デリゲート/ユース 与えられたインスタンス)
-
まだ何も思い浮かびません。架空の例を挙げると
new LinkedHashMap(LinkedHashSet<K>, List<V>)
これは、アイテムのクローンを作らない、変更不可能なリンクされたマップを返しますが は を使用します。そのjava.util.Collections#newSetFromMap()
とsingletonXXX()
というメソッドがありますが、それに近いものがあります。
コンポジット <サブ (のインスタンスを取る動作メソッドで認識可能)。 同じ 抽象型/インターフェース型を木構造に変換)
-
java.awt.Container#add(Component)
(実質的にSwingの全領域で) -
javax.faces.component.UIComponent#getChildren()
(実質的にJSF UI全体がそうです)
デコレーター <サブ (のインスタンスを取る作成メソッドで認識可能)。 同じ 抽象/インターフェース型であり、追加の挙動を追加する)
-
のすべてのサブクラスは
java.io.InputStream
,OutputStream
,Reader
そしてWriter
は同じ型のインスタンスを取るコンストラクタを持っています。 -
java.util.Collections
は、そのcheckedXXX()
,synchronizedXXX()
そしてunmodifiableXXX()
メソッドを使用します。 -
javax.servlet.http.HttpServletRequestWrapper
とHttpServletResponseWrapper
-
javax.swing.JScrollPane
ファサード <サブ (のインスタンスを内部で使用する動作メソッドで認識できます。 異なる 独立した抽象型/インターフェース型)
-
javax.faces.context.FacesContext
を使用し、内部的には抽象/インターフェース型であるLifeCycle
,ViewHandler
,NavigationHandler
などなど、エンドユーザーが気にする必要のないものがたくさんあります(ただし、インジェクションで上書き可能です)。 -
javax.faces.context.ExternalContext
を使用していますが、内部的にはServletContext
,HttpSession
,HttpServletRequest
,HttpServletResponse
など。
フライ級 <サブ (キャッシュされたインスタンスを返す作成メソッドで認識可能で、ちょっとした "multiton" のようなアイデア)
-
java.lang.Integer#valueOf(int)
(またBoolean
,Byte
,Character
,Short
,Long
そしてBigDecimal
)
プロキシ <サブ (与えられた抽象/インターフェース型の実装を返す作成メソッドによって認識され、その実装は次に デリゲート/ユース a 異なる の実装)
-
java.lang.reflect.Proxy
-
java.rmi.*
-
javax.ejb.EJB
( 説明はこちら ) -
javax.inject.Inject
( 説明はこちら ) -
javax.persistence.PersistenceContext
ビヘイビアパターン
責任の連鎖 <サブ (の同じメソッドを(間接的に)呼び出すビヘイビアメソッドで認識できる)。 別の の実装は 同じ 抽象/インターフェース型(キュー内)
コマンド <サブ (の実装にあるメソッドを呼び出す抽象/インターフェース型の動作メソッドで認識可能)。 異なる 抽象/インターフェース型 カプセル化 を作成する際に、コマンドの実装によって)
-
のすべての実装は
java.lang.Runnable
-
のすべての実装は
javax.swing.Action
インタープリター <サブ (を返す動作メソッドで認識できる)。 構造的に パースやフォーマットはパターンの一部ではなく、パターンの決定とその適用方法であることに注意してください)
-
java.util.Pattern
-
java.text.Normalizer
-
のすべてのサブクラスは
java.text.Format
-
のすべてのサブクラスは
javax.el.ELResolver
イテレータ <サブ (のインスタンスを順次返す動作メソッドで認識可能)。 異なる 型をキューから取り出す)
-
のすべての実装は
java.util.Iterator
(したがって、特にjava.util.Scanner
!). -
の実装はすべて
java.util.Enumeration
メディエーター <サブ (与えられたインスタンスを委譲/使用する別の抽象/インターフェース型(通常はコマンドパターンを使用)のインスタンスを取る動作メソッドによって認識される)
-
java.util.Timer
(すべてscheduleXXX()
メソッド) -
java.util.concurrent.Executor#execute()
-
java.util.concurrent.ExecutorService
(そのinvokeXXX()
とsubmit()
メソッド) -
java.util.concurrent.ScheduledExecutorService
(すべてscheduleXXX()
メソッド) -
java.lang.reflect.Method#invoke()
メメント <サブ (の状態を内部的に変化させるビヘイビアメソッドで認識可能)。 全体 インスタンス)
-
java.util.Date
(セッターメソッドで行います。Date
は、内部的にはlong
の値) -
のすべての実装は
java.io.Serializable
-
のすべての実装は
javax.faces.component.StateHolder
オブザーバー(またはパブリッシュ/サブスクライブ) <サブ (のインスタンスに対してメソッドを呼び出す動作メソッドで認識可能)。 別の 抽象型/インターフェース型、自身の状態による)
-
java.util.Observer
/java.util.Observable
(現実世界ではほとんど使われませんが) -
のすべての実装は
java.util.EventListener
(実質的にSwing全体がそうです) -
javax.servlet.http.HttpSessionBindingListener
-
javax.servlet.http.HttpSessionAttributeListener
-
javax.faces.event.PhaseListener
状態 <サブ (外部から制御できるインスタンスの状態に応じて振る舞いを変えるビヘイビアメソッドで認識可能)。
-
javax.faces.lifecycle.LifeCycle#execute()
(制御されるFacesServlet
この挙動はJSFライフサイクルの現在のフェーズ(状態)に依存する)
戦略 <サブ (の実装のメソッドを呼び出す抽象/インターフェース型の動作メソッドで認識可能)。 異なる 抽象/インターフェース型 パスイン ストラテジーの実装にメソッドの引数として渡す)
-
java.util.Comparator#compare()
などが実行されています。Collections#sort()
. -
javax.servlet.http.HttpServlet
は、そのservice()
およびすべてのdoXXX()
メソッドはHttpServletRequest
とHttpServletResponse
で、実装者はそれらを処理しなければなりません(インスタンス変数として手に入れるのではありません!)。 -
javax.servlet.Filter#doFilter()
テンプレート方式 <サブ (抽象型によって定義された "default" の振る舞いを既に持っている振る舞いメソッドによって認識可能)
-
の抽象的でないメソッドはすべて
java.io.InputStream
,java.io.OutputStream
,java.io.Reader
そしてjava.io.Writer
. -
の抽象的でないメソッドはすべて
java.util.AbstractList
,java.util.AbstractSet
そしてjava.util.AbstractMap
. -
javax.servlet.http.HttpServlet
は、すべてのdoXXX()
メソッドは、デフォルトで HTTP 405 "Method Not Allowed" エラーをレスポンスに送信します。これらのメソッドを実装しないことも、実装することも自由です。
訪問者 <サブ (2つの 異なる をそれぞれ受け取るメソッドが定義されている抽象/インターフェース型です。 他の 抽象/インターフェース型; 一方が他方のメソッドを実際に呼び出し、他方がそれに対して望ましい戦略を実行する)
関連
-
[解決済み] Spring Data JPAにおけるCrudRepositoryとJpaRepositoryのインターフェースの違いは何ですか?
-
[解決済み] MVPとMVC、その違いは何ですか?
-
[解決済み] Javaクラスにおけるcanonical name、simple name、class nameの違いは何ですか?
-
[解決済み] リスコフ置換原理の例として、どのようなものがありますか?
-
[解決済み] Java の assert キーワードは何をするのか、そしていつ使うべきなのか?
-
[解決済み] コヒーシ ョンとカップリングの違い
-
[解決済み] Abstract FactoryとFactoryのデザインパターンの違いは何ですか?
-
[解決済み】関数型プログラミングはGoFデザインパターンに取って代わるか?
-
[解決済み] メソッドチェイニング - なぜ良い習慣なのか、そうでないのか?
-
[解決済み] コンストラクタをprivateにするとどうなるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 抽象メソッドと仮想メソッドの違いは何ですか?
-
[解決済み] インターフェースと抽象クラス(一般的なOO)
-
[解決済み] Java のコア・ライブラリにおける GoF デザイン・パターンの例
-
[解決済み] デザインパターン Webベースアプリケーション【終了しました
-
[解決済み】Javaでシングルトンパターンを実装するための効率的な方法は何ですか?[クローズド]
-
[解決済み】「結合度が低く、結合度が高い」とはどういう意味ですか?
-
[解決済み] 実例で理解する「Decoratorパターン」【終了しました
-
[解決済み] 継承と集計の比較【終了しました
-
[解決済み] Dependency InjectionはEncapsulationを犠牲にしなければならないのか?
-
[解決済み] オブジェクト指向プログラミングにおける「インターフェイス」の定義とは?