デザインパターンの6つの原則
1、開閉原則(オープンクローズの原則)
の拡張のためのオープンが、修正のため閉鎖。
2、リヒター置換原理(リスコフの置換原則)
任意基底クラスが表示されることが、サブクラスが出現することができるであろう。
3.依存性逆転原理(依存性逆転原理)
抽象に依存するプログラミング・インターフェースのためには、特定に依存しません。
図4は、インターフェース分離原理(インタフェース偏析原理)
単離されたインターフェースの複数を使用して、単一のインターフェースを使用するよりも優れています。減少依存性結合を減らします。
5、デメテル(最小原理は知られている)(デメテル原理)
エンティティが他のエンティティ、そのような独立した機能モジュール間の相互作用を最小限にすべきです。
図6に示すように、多重化原理(複合リユース原理)の合成
合成高分子先/代わりの継承を利用します。
23個のJavaデザインパターン
分類 |
デザインパターン |
タイプ5の作成 |
ファクトリメソッドモデル(FactoryMethod)、抽象工場(AbstractFactory)、Builderパターン(ビルダー)、プロトタイプモデル(プロトタイプ)、シングルトン(シングルトン) |
構造7 |
アダプタモード(アダプタ)、ブリッジモード(ブリッジ)、組み合わせモード(コンポジット)、デコレータ(デコレータ)、ファサード・モード(外観)、フライ(フライ級)、プロキシモード(プロキシ) |
行動11 |
インタプリタモード(インタプリタ)、テンプレートメソッド(TemplateMethod)、責任パターン(ChainofResponsibility)、コマンドモード(コマンド)、反復モード(イテレータ)、メディエータモード(メディエータ)、メモモード(メメント)のチェーン、観察モード(オブザーバ)、状態モード(状態)、戦略モード(戦略)、ビジターパターン(訪問者) |
タイプの作成----- ------
Singletonパターン(シングルトン):
定義:
JVMでは、クラスのインスタンスを1つだけ確保します。
シナリオ:
Windowsのタスクマネージャ、ごみ箱は、春のIoCデフォルトのオブジェクトが作成されました。
長所と短所:
利点:メモリ、再利用、管理が容易に保存します。
短所:スレッドの安全性の問題。
初出:
1. 飢え式:クラスが初期化されるときに、オブジェクトは、すぐに本質的にスレッドセーフな、高いコールの効率をロードします。
2. 怠惰なスタイル:クラスが初期化されるときにオブジェクトを使用するための本当の必要性を作成するとき、オブジェクトは遅延ロード機能で、初期化されていません。
3. 静的な内部クラス:漢それぞれの利点の怠惰と空腹スタイルの組み合わせは、オブジェクトがロードされます真のニーズは、負荷クラスはスレッドセーフです。
4. ダブルロック検出:問題を解決するための並べ替え、volatileキーワードを高めます。
列挙シングルトン:列挙はシングルトン利点:!シンプル、高効率コールを達成する、列挙自体が単一の場合であり、基本的に反射し、抜け穴のデシリアライズすることによって回避JVMからの保護を提供するために、無欠点遅延ロード。
パブリック クラスEnumSingleton { プライベートEnumSingleton(){} パブリック 静的EnumSingletonのgetInstance(){ 戻りSingleton.INSTANCE.getInstanceを(); } プライベート 列挙シングルトン{ INSTANCE。 プライベートEnumSingletonシングルトン。 // JVM会保证此方法绝对只调用一次 シングルトン(){ シングルトン = 新しいEnumSingleton()。 } 公共EnumSingletonのgetInstance(){ 戻りシングルトン。 } } }
シングルトンを選択する方法:
飢えた男または列挙型、列挙よりよい:あなたはロードを遅延する必要はありません。
怠惰:静的な内部クラスや怠惰なタイプ、静的な内部クラスより良いです。
Factoryパターン(工場の):
Factoryパターンを指して、単純な植物(23種類のいずれかに属していない)、ファクトリメソッド、抽象工場を。
シンプルファクトリー:同じレベルの構造を生成するために使用される任意の製品。(製品を高めるために、拡張をサポートしていません。)
ファクトリメソッド:製品の同じ階層構造を製造するためには、固定されています。(製品を高めるために、拡張をサポートしています)
抽象ファクトリー:すべての製品の異なる製品群を生成するために使用されます。(製品を高めるための拡張をサポートしていません。サポートは製品ファミリの増加)
シンプル工場長所と短所:
長所:与えられた情報に基づいて外の世界には、オブジェクトがどの特定のクラスを作成する必要があるかどうかを決定することができます。
デメリット:すべてのインスタンスのコレクションは、植物、違法高い凝集、責任の割り当て、コードを変更するには、拡張することは困難を作成します。
ファクトリメソッド(FactoryMethod) :
抽象化コア工場は、インターフェイスのコンクリートプラントのための唯一の責任がある、コンクリートが作成するための責任を負いませんし、それを行うには、特定のサブクラスファクトリの賃金を作成します。
抽象ファクトリー(AbstractFactory) :
インテルとAMD製品ファミリ製品ファミリなど、さまざまな製品ファミリの製造のために。
そしてAbstract Factoryパターンを使用すると、複数の製品階層に直面する必要があります; Abstract Factoryパターンとファクトリメソッドモードの最大の違いは、Factory Methodパターンのための階層構造の産物である、ということです。
ビルダーモード(ビルダー):
これは、同一のビルドプロセスが異なる表現を作成することができるように、構築物および複合オブジェクトのその分離を表します。
Factoryパターンは、ビルダーは、複合オブジェクトクラスを作成し、単一のクラスを作成します。これは、異なる属性を持つ複合オブジェクトのクラスを指します。
シナリオ:
KFCは、パッケージを購入します。ハンブルク、コーラ変わりません。その他のフライドポテト、フライドチキンウィングは常に異なるパッケージを生成するために、組み合わせを変えます。
プロトタイプモデル(プロトタイプ):
プロトタイプモデルの表面は、というプロパティ一貫したオブジェクトモデル、内部からオブジェクトのコピーモデル例を有するクローンを、実施例がコピーされる「プロトタイプ」です。
プロトタイプモデルは、より効率的に実行することができ、既存のインスタンスをコピーし、この場合のように、複雑で時間のかかる構成例の複製を作成するために使用します。
シナリオ:
プロトタイプの多くの例は、春のIoCで作成されます。
構造------ ------
エージェントモード(プロキシ):
プロキシオブジェクトを介してアクセス制御は、この方法は、前処理法、または呼処理に呼び出した後、オブジェクトの詳細にアクセスすることができます。静的および動的サブプロキシエージェント。
静的プロキシ:プロキシクラスの生産ニーズ。複数のプロキシへのインタフェースは、それが静的プロキシクラスの多くを生成します。
ダイナミックエージェント:JDKの動的プロキシ、CGLIBエージェント(オペレーションコードバイト)
シナリオ:
レンタル代理店、春AOP、トランザクションの原理は、その上の印刷、アクセス制御、リモート呼び出し、およびを記録します。
JDKの動的プロキシは、ターゲット・ビジネスクラスはインタフェースを実装する必要があります。
具体的のInvocationHandlerインタフェースを実現するために、処理対象を呼び出します。
CGLIB動的プロキシ、インターフェイスを実装していない委譲クラス。オペレーションバイトコードサブクラス化。
JDK CGLIB間の動的プロキシ動的な差
処理するために、特定のメソッドを呼び出す前に、インタフェース・コール・InvokeHandlerを実装匿名プロキシクラスを生成するためにリフレクションを使用してJava動的プロキシ。
サブクラスのバイトコードを変更することによって処理中にロードされたオープンソースパッケージ、クラスファイルのプロキシオブジェクトクラスを使用して、ASM動的プロキシCGLIB。
アダプタモード(アダプタ):
所望の別のインタフェースへのクラスのインターフェースを変換。互換性のないインタフェースのこれらのクラスのためのアダプタモードは一緒に働くことができます。エイリアスラッパー(ラッパー)。
2つのモードでアダプタ:クラスアダプタオブジェクトアダプタ
動的に結合されるように、オブジェクトアダプタオブジェクト組成物;クラスオブジェクトは、アダプタ方法、静的方法の定義を継承します。
1.クラスアダプタモード:アダプタ機能を継承によって達成されます。
シナリオ:
SpringMVC
アピアランスモデル(ファサード):
また、システムの複雑さを隠し、およびシステム・クライアントにアクセス可能なクライアントへのインターフェースを提供するファサード・モードを、既知の。
シナリオ:
ユーザ登録が完了した後に、メッセージング・インターフェース、マイクロチャネルインターフェイス、電子メールインターフェイスを呼び出します。唯一の複雑な実装の内部に隠されたインターフェース・メッセージ・インターフェースを提供します。
行動------ ------
Template Methodパターン(TemplateMethod) :
アルゴリズムは動作のスケルトンを定義し、いくつかのステップは、サブクラスの遅延を実施しました。サブクラスが実装抽出するために、親クラス、異なるサービスにすべてのコードを繰り返します。よく親クラスで定義された処理ステップは、遅延は、特定のサブクラスの定義に実装されています。
シナリオ:ビジネスを行う銀行。最初の(私たちは部分的に完了したコアをサブクラス化)事業を行うために、右の行、顧客サービスの評価に、完成された番号を取る:銀行は、テンプレートを提供してくれます。
サーブレットのdoGet / doPostメソッド、Hibernateのテンプレートプログラムや、そのJDBCTemplate春、RestTemplateと。
戦略モード(Stragey):
アルゴリズムまたは論理のセットについて、各論理アルゴリズム又はそれらが相互に置き換えることができるように、共通のインタフェースを有する別のクラスにカプセル化。モードポリシーまたはアルゴリズムの論理の変化がクライアントの場合に影響を与えることができないようになっています。クローズ原則OCPを開きます。
シナリオ:
積極的な割引の異なるレベルの異なるメンバーは、3つの戦略、ジュニアメンバー、中間部材、シニアメンバーに分け。
モードオブザーバ(オブザーバー):
図1は、主にNを通知するために使用され オブジェクトの状態の変化が、彼は速やかに応じてそれらを作る、一連のオブジェクトに通知する必要がある場合。
二つの方法で実装されました:
プッシュ:通知がすべてのオブザーバにブロードキャスト方式で送信され、すべてのオブザーバは受動的に受け取ることができます。
プル:限り、視聴者が状況を知ることができるよう、コンテンツを取得する必要がある場合のように、あなたが決めることができるもの、へのアクセスを。
シナリオ:
クロスシステムメッセージ交換シナリオ、メッセージキュー、イベントリスナーが処理されます。