リアルタイムの例で設計パターンを学びたいです。だから、誰でも私がどこから始めることができるかを提案できます.
4 に答える
これらの古典的なデザイン パターンは、すべての開発者が理解する必要があります。これは、他の開発者の抽象的なレベルとのコミュニケーションに役立ち、より優れた設計者になるためです。
注:実生活と Java API の例を使用して簡単な定義を追加します。
創造的な
オブジェクトの作成方法。
プロトタイプ :コピーまたは複製される完全に初期化されたインスタンス
例 : チェス ゲームの初期状態
java.lang.Object#clone()
ビルダー- 複雑なオブジェクトの構築をその表現から分離して、同じ構築プロセスで異なる表現を作成できるようにします。
例 : ピザを作る (または注文する) 場合 (サイズとフレーバーが異なる場合があります)
- java.lang.StringBuilder
シングルトン- 単一のインスタンスしか存在できないクラス
例: 大統領
- java.lang.Runtime#getRuntime()
ファクトリ メソッド-オブジェクト タイプのファミリを作成します。
例 : ある組織では、HR がファクトリ メソッドとして機能します。ここで、開発チームは、HR に必要なリソースのタイプを要求します。リクエストの種類に基づいて、HR は開発チームにリソースを提供します。
- java.util.Calendar#getInstance()
抽象ファクトリ- クラスのいくつかのファミリのインスタンスを作成します
。例: HP、Samsung、および Dell のラップトップは、Intel および AMD プロセッサを使用しています。
- javax.xml.parsers.DocumentBuilderFactory#newInstance()
構造的
この設計パターンは、クラスとオブジェクトの構成に関するものです。つまり、ソフトウェア コンポーネントをどのように構造化しますか。これにより、パーツの 1 つが変更されても、構造全体を変更する必要がないことが保証されます。
プロキシ- 別のオブジェクトを表すオブジェクト。
例 : 小切手帳の葉、クレジット カード、デビット カードは、Money および顧客担当者が製品を注文するための代理です。
- java.rmi.*、実際には API 全体です。
Composite - リーフとコンポジットに統一されたインターフェースを提供します.
例 : オペレーティング システムのファイル システム、ディレクトリはコンポジット、ファイルはリーフです。システム コールOpen
は、コンポジットとリーフの両方で単一のインターフェイスです。
Decorator - 統一されたインターフェースを提供しながら、オブジェクトに追加機能を提供します。
例 : 1) 注文に割引を追加する2) 銃はそれ自体が致命的な武器です。ただし、特定の「装飾」を適用して、より正確で静かで壊滅的なものにすることができます。
- java.io.InputStream、OutputStream、Reader、および Writer のすべてのサブクラスには、同じ型のインスタンスを取るコンストラクターがあります。
Facade - サブシステム全体を表す単一のインターフェイス。
例 : コントロール パネル、イベント マネージャー。
- ServletContext、HttpSession、HttpServletRequest、HttpServletResponse などを内部的に使用する javax.faces.context.ExternalContext
アダプター- インターフェイスにさまざまなインターフェイスを提供します。
例:電源アダプター
- java.util.Arrays#asList()
Flyweight - 効率的な共有に使用されるきめの細かいインスタンス
例: Flyweight は効率的な多数のオブジェクトをサポートするために共有を使用しますhttps://refactoring.guru/design-patternsly。公衆交換電話網は Flyweight の一例です。すべてのサブスクライバ間で共有する必要があるダイヤル トーン ジェネレータ、リンギング ジェネレータ、ディジット レシーバなど、いくつかのリソースがあります。加入者は、電話をかけるためにハンドセットを持ち上げたときに、プールにあるリソースの数を認識していません。加入者にとって重要なことは、ダイヤル トーンが提供され、数字が受信され、通話が完了することだけです。
- java.lang.Integer#valueOf(int) (Boolean、Byte、Character、Short、Long についても)
行動
この設計パターンは、特にオブジェクト間の通信に関係しています。
責任の連鎖- 一連のオブジェクト間で要求を渡す方法
例: ローンまたは休暇の承認プロセス、Java での例外処理。
- javax.servlet.Filter#doFilter()
イテレータ- コレクションの要素に順次アクセスする
例: TV の [次へ/前へ] ボタン
- java.util.Iterator と java.util.Enumeration のすべての実装
状態- 状態が変化したときにオブジェクトの動作を変更します
例: ファン ウォール コントロール
オブザーバー- いくつかのクラスへの変更を通知する方法
例: 入札またはオークション
- パブリッシュ/サブスクライブ JMS API
Visitor - 変更なしでクラスに新しい操作を定義します。例:タクシー
テンプレート- 操作でアルゴリズムのスケルトンを定義し、いくつかのステップをサブクラスに任せます。
例:ブループリント
- 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" エラーを応答に送信します。何も実装しないか、どれかを自由に実装できます。
- JMSTemplate Spring の HibernateTemplate と JdbcTemplate
コマンド- コマンド要求をオブジェクトとしてカプセル化します
。 例: ダイナーでの「ゲスト チェック」は、コマンド パターンの例です。ウェイターまたはウェイトレスは、顧客から注文またはコマンドを受け取り、小切手に書き込むことでその注文をカプセル化します。その後、注文はショート オーダー クックのキューに入れられます。各ウェイターが使用する「チェック」のパッドはメニューに依存しないため、多くの異なるアイテムを調理するコマンドをサポートできることに注意してください。
- java.lang.Runnable のすべての実装
Memento - オブジェクトの内部状態をキャプチャして復元する
例: ゲームで状態を保存し、Windows で元に戻す/やり直し操作を行う
- java.io.Serializable のすべての実装
Mediator - クラス間の簡略化された通信を定義します
例: 航空管制官 (ATC)
ストラテジー- ストラテジーは、互換的に使用できる一連のアルゴリズムを定義します。
例:交通手段
- java.util.Comparator#compare()、とりわけ Collections#sort() によって実行されます。
- javax.servlet.http.HttpServlet、service() およびすべての doXXX() メソッドは HttpServletRequest および HttpServletResponse を受け取り、実装者はそれらを処理する必要があります (インスタンス変数として取得しないでください!)。
- javax.servlet.Filter#doFilter()
私はこれらが2つの標準的な参照であると信じています:
私が聞いたところによると、最初の方が簡単に始められます。
これを調査するために私が取った手順:
- グーグル「デザインパターンブック」
- この質問を読む
C#デザインパターンをお探しの場合は、以下を参照してください。
「C#デザインパターンのチュートリアル」-Jame W Cooper