本文へ移動

CooLWJを検索

选择搜索范围,输入关键词后按回车。

言語

JDK ではどのようなデザインパターンが使われているか?

一、構造に関するパターン

1,アダプターパターン

あるインターフェースを別のインターフェースに変換するために使う

java.util.Arrays#asList()

javax.swing.JTable(TableModel)

java.io.InputStreamReader(InputStream)

java.io.OutputStreamWriter(OutputStream)

javax.xml.bind.annotation.adapters.XmlAdapter#marshal()

javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal()

2,ブリッジパターン

このパターンは、抽象と抽象操作の実装を分離することで、抽象と実装を独立して変更できるようにします

AWT(ネイティブ OS のウィンドウ機能に対応付ける抽象化レイヤーを提供する。)

JDBC

3,コンポジットパターン

これにより、クライアントからは単一のオブジェクトもオブジェクトの組み合わせも同等に扱えます。言い換えると、ある型のメソッドが、自身と同じ型も引数として受け入れるということです

javax.swing.JComponent#add(Component)

java.awt.Container#add(Component)

java.util.Map#putAll(Map)

java.util.List#addAll(Collection)

java.util.Set#addAll(Collection)

4,デコレーターパターン

オブジェクトに追加の機能を動的に付与するもので、サブクラスを使う方法の代わりにもなります。ある型のオブジェクトを作成する際に、同じ型のオブジェクトも渡していることが分かります。これはJDKの至る所で見られ、本当にどこにでもあると気づくでしょう。そのため、以下の一覧はほんの一部にすぎません

java.io.BufferedInputStream(InputStream)

java.io.DataInputStream(InputStream)

java.io.BufferedOutputStream(OutputStream)

java.util.zip.ZipOutputStream(OutputStream)

java.util.Collections#checked<list |sortedmap |sortedset |set |map>

5,ファサードパターン

一群のコンポーネント、インターフェース、抽象、またはサブシステムに対し、シンプルなインターフェースを提供する

java.lang.Class

javax.faces.webapp.FacesServlet

6,フライウェイトパターン

キャッシュを使って、大量の小さなオブジェクトへのアクセス時間を短縮する

java.lang.Integer#valueOf(int)

java.lang.Boolean#valueOf(boolean)

java.lang.Byte#valueOf(byte)

java.lang.Character#valueOf(char)

7,プロキシパターン

プロキシパターンとは、複雑なオブジェクトや生成に時間のかかるオブジェクトを、単純なオブジェクトで代替するものである。

java.lang.reflect.Proxy

RMI


Javaのコーヒーカップと組み立ての場面でソフトウェア設計を表現したイラスト

二,生成パターン

1,抽象ファクトリーパターン

抽象ファクトリパターンは、具体的なオブジェクトの型を指定せずに、関連する、または独立した一連のオブジェクトを生成するためのプロトコルを提供します。これにより、アプリケーションを使用するフレームワークの具体的な実装から切り離せます。JDKやSpringなどの多くのフレームワークで広く見られます。見分けるのも簡単で、新しいオブジェクトを作成するメソッドがインターフェースや抽象クラスを返していれば、それが抽象ファクトリパターンです

java.util.Calendar#getInstance()

java.util.Arrays#asList()

java.util.ResourceBundle#getBundle()

java.sql.DriverManager#getConnection()

java.sql.Connection#createStatement()

java.sql.Statement#executeQuery()

java.text.NumberFormat#getInstance()

javax.xml.transform.TransformerFactory#newInstance()

2,ビルダーパターン(Builder)

複雑なオブジェクトの生成を簡素化するために、別のクラスのインスタンスを構築する新たなクラスを定義します。ビルダーパターンも通常、メソッドチェーンを使って実装します

java.lang.StringBuilder#append()

java.lang.StringBuffer#append()

java.sql.PreparedStatement

javax.swing.GroupLayout.Group#addComponent()

3、ファクトリーメソッド

とは、具体的なオブジェクトを返すメソッドです

java.lang.Proxy#newProxyInstance()

java.lang.Object#toString()

java.lang.Class#newInstance()

java.lang.reflect.Array#newInstance()

java.lang.reflect.Constructor#newInstance()

java.lang.Boolean#valueOf(String)

java.lang.Class#forName()

4,プロトタイプパターン

クラスのインスタンスが自身のコピーを生成できるようにします。オブジェクトのインスタンスを作成する処理が非常に複雑で時間がかかる場合は、このパターンを利用できます。新しいインスタンスを作り直す代わりに、オブジェクトをコピーして直接変更できます

java.lang.Object#clone()

java.lang.Cloneable

5、シングルトンパターン

クラスのインスタンスが一つだけであることを保証するために使います。Joshua BlochはEffetive Javaで、もう一つの方法として列挙型の使用を勧めています

java.lang.Runtime#getRuntime()

java.awt.Toolkit#getDefaultToolkit()

java.awt.GraphicsEnvironment#getLocalGraphicsEnvironment()

java.awt.Desktop#getDesktop()


三、振る舞いのパターン

1、責任の連鎖パターン

リクエストが処理されるまで、あるオブジェクトからチェーン内の次のオブジェクトへと渡していくことで、オブジェクト間の結合を解消します

java.util.logging.Logger#log()

javax.servlet.Filter#doFilter()

2、コマンドパターン

操作をオブジェクト内にカプセル化し、保存、受け渡し、返却ができるようにする

java.lang.Runnable

javax.swing.Action

3,インタープリターパターン

このパターンでは通常、ある言語の文法を定義し、その文法に従った文を解析する

java.util.Pattern

java.text.Normalizer

java.text.Format

4,イテレーターパターン

コレクション内のオブジェクトに順番にアクセスするための一貫した方法を提供し、その方法は基盤となるコレクションの具体的な実装に依存しません

java.util.Iterator

java.util.Enumeration

5,メディエーターパターン

仲介オブジェクトを使ってメッセージを振り分け、クラス間の直接的な依存を減らすことで

java.util.Timer

java.util.concurrent.Executor#execute()

java.util.concurrent.ExecutorService#submit()

java.lang.reflect.Method#invoke()

6、メメントパターン

オブジェクトの状態のスナップショットを生成し、内部の内容を公開せずに元の状態へ復元できるようにする。Dateオブジェクトは、内部のlong値を通じてメメントパターンを実現している

java.util.Date

java.io.Serializable

7,ヌルオブジェクトパターン

このパターンは、意味を持たないオブジェクトを使って、オブジェクトが存在しない状態を置き換えます。これにより、空のオブジェクトを別途処理する必要がなくなります

java.util.Collections#emptyList()

java.util.Collections#emptyMap()

java.util.Collections#emptySet()

8,Observerパターン

これにより、あるオブジェクトが、関心を持つオブジェクトに柔軟にメッセージを送信できる

java.util.EventListener

javax.servlet.http.HttpSessionBindingListener

javax.servlet.http.HttpSessionAttributeListener

javax.faces.event.PhaseListener

9,Stateパターン

オブジェクトの内部状態を変えることで、実行時にオブジェクトの振る舞いを動的に変更できる

java.util.Iterator

javax.faces.lifecycle.LifeCycle#execute()

10、ストラテジーパターン

このパターンを使って、一群のアルゴリズムを一連のオブジェクトにカプセル化します。これらのオブジェクトを渡すことで、プログラムの機能を柔軟に変更できます

java.util.Comparator#compare()

javax.servlet.http.HttpServlet

javax.servlet.Filter#doFilter()

11、テンプレートメソッドパターン

サブクラスがメソッド全体ではなく一部をオーバーライドできるようにし、サブクラスがどの操作をオーバーライドする必要があるかを制御できる

java.util.Collections#sort()

java.io.InputStream#skip()

java.io.InputStream#read()

java.util.AbstractList#indexOf()

12、ビジターパターン

一群のオブジェクトを操作するための、便利で保守しやすい方法を提供します。操作対象のオブジェクトを変更せずに、その振る舞いを変更または拡張できます

javax.lang.model.element.Element と javax.lang.model.element.ElementVisitor

javax.lang.model.type.TypeMirrorおよびjavax.lang.model.type.TypeVisitor

訳者注:多くの点で議論の余地があるかもしれません。あるパターンに当たるかどうかは、実のところそれほど重要ではありません。重要なのは、それらの設計から、私たちのコードを改善するための知見が得られることです


コメント

送信中

好きなテーマを選ぶ

選んだテーマはサイト全体に適用されます。