blog

Android Advancedがデザインパターンについて大いに語る

一般的には、シングルトン、ファクトリー、オブザーバー、プロキシ、コマンド、アダプター、コンポジット、ビジターの 8 つのデザイン・パターンがよく使われます。...

Jul 8, 2025 · 11 min. read
シェア

一般的によく使われるデザインパターンは、シングルトン、ファクトリー、オブザーバー、プロキシ、コマンド、アダプター、コンポジット、ビジターの8つです。

シングルトンパターン:システム内で呼び出すオブジェクトを1つにすることが目的。シングルトンの欠点は、他のプログラムがシングルトンに過度に依存してしまうこと、また、異なるシングルトンが異なるプロセスで実行されるため、メンテナンスが困難になること;

ファクトリパターン:抽象クラスなどの物事の固定数の生産は、欠点は、製品の変更トラブルです。このようなアクション映画や恋愛映画のように、それぞれ、サーバーに同じ要求を発行するには、彼らが見たい映画のセットを取得することができます、同じ要求のための別のオブジェクトに相当する、需要が満たされています。

Observer パターン: キャッシュなど、オブジェクトを監視する複数のオブジェクトです;

プロキシモデル:自分自身のことを他の人が行うには、それぞれ、非同期スレッドなどの結果を返すことができます;

コマンドパターン:呼び出すオブジェクトと動作するオブジェクトを分離し、コントローラなどのミドルウェアが両者の間を調整します;

アダプターパターン:ユーザーがインターフェイスを必要とするようにインターフェイスは、baseadapterのようなリストビューとスピナーに適応することができます、彼らは同じインターフェイスを持っているので

複合パターン: リストビューとアダプタのように、1対多のリレーションシップを1対全体のリレーションシップに変換します;

アクセサパターン:instanceofのように、オブジェクトによって扱いが異なります。

創造に基づくモデル

1、FACTORY - MMが食べることが少ない追いかける、マクドナルドの手羽先とKFCの手羽先は、味は異なりますが、あなたがマクドナルドやKFCにMMを取るに関係なく、物事を食べるためにMMが大好きですが、ちょうどウェイターに "4チキンウィングに "と言ったライン上。マクドナルドとKFCは手羽先を生産する工場です。

ファクトリーパターン:顧客クラスとファクトリークラスを分離。消費者が特定の製品を必要とするときはいつでも、ファクトリーに要求するだけです。消費者は修正なしで新しい製品を受け入れることができます。欠点は、製品が変更されると、ファクトリクラスもそれに応じて変更しなければならないことです。例えば、どのように作成し、どのようにクライアントに提供するかです。

ビルド・パターン:製品の内部表現を製品の生成プロセスから分離し、単一のビルド・プロセスで異なる内部表現を持つ製品オブジェクトを生成できるようにします。ビルド・モデルでは、製品の内部構成の詳細を顧客が知ることなく、製品の内部表現を独立して変更することができます。ビルド・モデルは、段階的な構築プロセスを強制します。

3、ファクトリーメソッド - ハンバーガーを食べるためにマクドナルドにMMを招待し、異なるMMは、それぞれを覚えて迷惑なことである、異なる味を持って、私は一般的にファクトリーメソッドモードを使用し、そこにウェイターにMMと、 "ハンバーガーに "と述べました!私は通常、工場方式モードを使用し、ウェイターにMMを取り、 "私はハンバーガーを食べたい "と言って、どのようなハンバーガーをしたい、MMが直接行にウェイターに話をしましょう。

ファクトリーメソッドパターン:コアファクトリークラスは、もはやすべての製品の作成に責任を負いませんが、作業の具体的な作成をサブクラスに任せ、抽象的なファクトリーの役割になり、具体的なファクトリークラスにインターフェイスを実装する必要がありますを与えることだけに責任があり、どの製品クラスがインスタンス化されるべきかの詳細には触れません。

プリミティブ・モデル・パターン: プロトタイプ・オブジェクトを与えることで作成するオブジェクトのタイプを指定し、プロトタイプ・オブジェクトをコピーすることで同じタイプのオブジェクトをさらに作成します。プリミティブ・モデル・パターンでは、製品クラスを動的に追加・削除することができます。 製品クラスはあらかじめ定義された階層構造を持つ必要はなく、プリミティブ・モデル・パターンはどのような階層構造でも動作します。欠点は、各クラスに clone メソッドを持たなければならないことです。

5、SINGLETON - 私には6人の美しい妻がいます、彼らの夫は私です、私は家族の夫です シグルトン、彼らが "夫 "と言う限り、同じ人、つまり私を指しています!

シングルトンパターン: シングルトンパターンは、クラスのインスタンスが1つしか存在しないこと、そしてクラス自身がインスタンスを生成し、そのインスタンスをシステム全体が利用できるようにすることを保証します。シングルトンパターンは、「単一のインスタンス」が本当に必要な場合にのみ使われるべきです。

構造モデル

アダプタ・パターン: あるクラスのインターフェイスを、クライアントが期待する別のインターフェイスに変換します。アダプタクラスは、パラメータに基づいて適切なインスタンスをクライアントに返すことができます。

7、BRIDGE - 朝はMMに会った、おはようございますと言うために、夕方はMMに会った、こんばんはと言うために、MMの新しい服を着て会った、服はああ、MMの新しいヘアスタイルに会ったことを言うために、非常に美しいです髪がああ。私は新しいMMのヘアスタイルに会ったときに朝に言う方法 "この種の問題は、自分のBRIDGEの組み合わせは、ライン上にありません私に聞かないでください!

Bridgeパターン:抽象化と実現が独立して変化できるように、抽象化と実現とを切り離すこと、つまり、両者の間の強い関連性を弱い関連性に変えること。

8、COMPOSITE-メアリーは今日誕生日です。"誕生日にはプレゼントをくれないと""まあいいわ、お店に行って自分で選んで""このTシャツ可愛いから買って、このスカートも素敵だから買って、このバッグも素敵だから買って""おい、3つも買ってるじゃないか、プレゼントは1つしか約束してないぞ"「Tシャツとスカートとバッグ、セットで買えばいいじゃない、MM。"......"、MMは合成モードを使用します、あなたはしないのですか?

Synthesis Pattern(合成パターン):合成パターンは、オブジェクトをツリー構造に編成し、全体と部分の関係を記述するために使用できます。「Element Import」 なし 限定子を付けない名前で表し ます。合成パターンは、部分と全体の関係をツリー構造で表します。コンポジットスキーマによって、クライアントは個々のコンポーネントオブジェクトを、それらを合成して作成されるコンポジットオブジェクトと同じように扱うことができます。

9、DECORATOR-メアリーSarly誕生日へのターンの上に、または自分自身を選択するために彼女に尋ねないか、さもなければ、今月の食費を再生する必要があり、マウント華山の写真の上に私の最後の年を取り出し、書き込みの背面に "最高の贈り物は、フィタを愛することです "と、その後通りに!フレームを購入するギフトショップは、その後、アートデザインマイクがマウントされた美しい箱を設計に従事する隣を見つける......、装飾家であり、最終的には私の人の修正でああ、どのように、参照してください理解できますか?

装飾パターン: クライアントに対して透過的な方法でオブジェクトの機能を拡張するもので、継承関係に代わるものです。オブジェクトに動的に機能を追加し、それを動的に削除することができます。基本的な関数の並べ替えにより、非常に多くの関数を追加することができます。

10、ファサード - 私はプロのニコンのカメラを持って、私は写真のうち、プロであるように、手動で絞り、シャッターを調整したいのですが、MMはこれらを理解していない、半日を教えることはありません。幸いなことに、カメラはファサードのデザインモードを持っている限り、ターゲットが行にシャッターを押すと、すべてが自動的にMMも写真を撮るために私にこのカメラを使用できるように、カメラによって調整された、自動に調整されたカメラ。

ファサード・パターン:サブシステムとの外部通信は、統一されたファサード・オブジェクトを介して行われる必要があります。ファサード・パターンは、サブシステムを使いやすくする高レベルのインターフェースを提供します。各サブシステムはファサードクラスを1つだけ持ち、このファサードクラスはインスタンスを1つだけ持ちます。しかし、システム全体は複数のファサード・クラスを持つことができます。

11、FLYWEIGHT - MMのテキストメッセージで毎日、指が疲れている、最近、新しい携帯電話を購入し、あなたが時間を使用するために、携帯電話に存在するいくつかの一般的に使用される文章を置くことができ、直接MMの名前で前から送信することができますし、単語ごとにノックする必要はありません。共有文はFlyweightで、MMの名前は文脈に応じて抽出され、使用される外部機能です。

ヘドニック・パターン:FLYWEIGHTはボクシングで最も軽いという意味。ヘドニック・パターンは、大量のきめ細かなオブジェクトを効率的に共有でサポートします。ヘドニックパターンの共有能力の鍵は、暗黙的状態と明示的状態の区別にあります。埋め込み状態はヘドンの内部に保存され、環境によって変化することはありません。埋め込まれた状態は環境が変わると変化します。具現化された状態は埋め込まれた状態に影響を与えることはできず、それらは互いに独立しています。通常のクラスからは共有できる状態と共有できない状態を区別し、クラスからは共有できない状態を除外します。共有オブジェクトを直接作成する代わりに、クライアントはファクトリーオブジェクトを使用して共有オブジェクトの作成を行います。ヘドニック・パターンは、メモリ上のオブジェクトの数を劇的に減らします。

プロキシパターン:プロキシパターンは、オブジェクトにプロキシオブジェクトを提供し、プロキシオブジェクトがソースオブジェクトへの参照を制御します。プロキシとは、他の人や組織に代わって行動する人や組織のことです。クライアントがオブジェクトを直接参照したくない、あるいは参照できない場合、プロキシオブジェクトは仲介者としてクライアントとターゲットオブジェクトの直接的な役割を果たすことができます。クライアントは、プロキシ対象オブジェクトと本当の対象オブジェクトを区別することができません。プロキシパターンは、プロキシオブジェクトの本当の主題を知ることができないが、唯一のプロキシオブジェクトのインターフェイスを保持し、プロキシオブジェクトは、プロキシオブジェクトの主題を作成することはできません、プロキシオブジェクトの主題は、システム内の他の役割の代わりに作成し、渡される必要があります。

行動モデル

責任の連鎖パターン:責任の連鎖パターンでは、各オブジェクトがその下位のオブジェクトを参照することで、多くのオブジェクトがピックアップされます。

を上にしてチェーンを形成します。リクエストは、チェーンのオブジェクトの一つがリクエストを処理すると決定 するまで、このチェーンを通過します。クライアントはチェーンのどのオブジェクトが最終的にリクエストを処理するのかを知りません。システムはクライアントに影響を与えることなく、チェーンを動的に再編成し、責任を割り当てることができます。ハンドラには、責任を取るか次の人に譲るかの二つの選択肢があります。リクエストはどの受け手オブジェクトにも受け入れられずに終わることもありえます。

14、COMMAND - 私はMMのホームコントロールが特に厳しいですが、会うことができない、情報の伝送の間に2つの彼女の兄に頼らざるを得なかった、彼女は私にどんな指示を持って、私をもたらすために彼女の兄にメモを書きます。彼女の弟は、彼に感謝するために、私は彼にミックスソースの麺を食べるために招待し、別のコマンドを送ったが、私は彼が言ったことを知りませんでした: "私は同時に妹の3人のボーイフレンドにコマンドを送信しますが、あなたは麺を食べるために私を招待するだけで、最もケチです。", :-(

コマンドパターン: コマンドパターンは、リクエストや操作を1つのオブジェクトにカプセル化します。コマンドパターンは、コマンドを発行する責任とそれを実行する責任を分離し、異なるオブジェクトに委譲します。コマンドパターンによって、要求側と送信側は互いに独立することができ、要求側は要求を受け取った側のインターフェースはもちろん、要求がどのように受け取られたのか、操作が実行されたのか、いつ、どのように実行されたのかを知る必要がなくなります。コマンドの取り消しをサポートします。

15、INTERPRETER - 私は "バブルMMの本当の経典 "を持って、そのような西洋風のステップを食べに行くなど、バブルMM戦略の様々な、映画館のメソッドに行くなど、MMの出会いがあり、限り通訳を行うには、上記のスクリプトによると、実装することができます。

インタープリター・パターン: 言語が与えられると、インタープリター・パターンはその文法の表現を定義し、同時にインタープリターを提供することができます。クライアントはこのインタプリタを使って、その言語の文を解釈することができます。インタープリター・パターンは、簡単な文法を持った後で、パターン・デザインを使ってこれらの文を解釈する方法を記述します。インタプリタパターン内で言及される言語は、どのインタプリタオブジェクトでも解釈できる任意の組み合わせです。インタプリタパターンでは、文法、すなわち組み合わせルールの集合を表すコマンドクラスの階層を定義する必要があります。各コマンドオブジェクトは、コマンドオブジェクトの解釈を表す interpret メソッドを持っています。コマンドオブジェクトの階層におけるオブジェクトの並べ替えはすべて言語です。

16, ITERATOR- メアリーと恋に落ち、あらゆる困難を乗り越えてプロポーズしました。

私:「どんな条件にも同意します。

メアリー: "あの1カラットのダイヤモンドに目がないの"

私:"いただきます、いただきます、これ以上は?"

メアリー: "湖のほとりのコテージに目をつけてるの"。

私:"いただきます、いただきます、これ以上は?"

メアリー:"ペニスの長さは50cmでなければなりません"。

頭がガンガンして、歯ぎしりしながら椅子に座り直し、"切るぞ、切るぞ、これ以上は?"と。

......

Iterator Patterns: Iterator パターンを使用すると、集約の内部を公開することなく、集約の要素に順次アクセスすることができます。複数のオブジェクトの集合体は集約と呼ばれ、集約オブジェクトはオブジェクトのグループを含むことができるコンテナオブジェクトです。イテレーターパターンは、反復ロジックを、集約自体から分離された別のサブオブジェクトにカプセル化します。イテレータパターンは、集約へのインターフェースを単純化します。各集約オブジェクトは、1 つ以上の反復子サブオブジェクトを持つことができ、各反復子の反復状態は互いに独立していることができます。反復アルゴリズムは、集約の役割とは無関係に変更できます。

17、MEDIATOR - 4つのMMの麻雀、お互いに誰が誰にどのくらいのお金を与える必要があり、明確ではありませんが、幸いなことに、私はお金の独自の計算に従ってチップの数の隣にあった、お金を取るためにここから私からお金を稼いだ、私にお金を支払うためにお金を失った、すべてが大丈夫でしょう、私は4つのMMの電話番号を取得しました。

Mediator パターン: Mediator パターンは、相互に作用する一連のオブジェクトを、これらのオブジェクトが互いに目に見える形で作用する必要がないようにラップします。したがって、疎結合にすることができます。あるオブジェクトの役割が変更されても、他のオブジェクトの役割には影響しません。これらのロールは互いに独立に変化することが保証されています。Mediator パターンは多対多のやりとりを一対多のやりとりに変換します。Mediator パターンは、オブジェクトの振る舞いや協調を抽象化し、小さなスケールの振る舞いで他のオブジェクトとの相互作用を個別に扱います。

18、MEMENTO - いくつかのMMのチャットと同時に、MMに何かを言うだけで、明確に覚えていることを確認してください、またはMMはああ、幸いなことに、私はメモを持っている、ちょうどあなたが常に前のレコードを見ることができるように、保存内のメモのコピーを持っているMMと何かを言うでしょう。

メモ・パターン: メモ・オブジェクトは、他のオブジェクトの内部状態のスナップショットを保存するために使用されるオブジェクトです。メモ・パターンの意図は、カプセル化を壊すことなくオブジェクトの状態をキャッチし、それを外部化して保存し、将来の適切なタイミングでオブジェクトを保存した状態に復元できるようにすることです。

19、OBSERVER-当社の最新のMM情報を知りたいですか?ラインの会社のMM情報メールグループに参加し、トム情報収集の責任者、彼は1つずつ通知することなく、新しい情報を発見し、直接メールグループにリリースされ、加入者としてタイムリーに情報を受け取ることができるようになります!

Observerパターン:Observerパターンは、複数のオブザーバーオブジェクトが同時に特定のサブジェクトオブジェクトをリッスンできるようにする、1チーム多依存関係を定義します。このサブジェクトオブジェクトは、状態を変更するとすべてのオブザーバーオブジェクトに通知し、自動的に更新できるようにします。

ステートパターン:ステートパターンは、オブジェクトの内部状態が変化したときに、そのオブジェクトの振る舞いを変化させることができます。オブジェクトはあたかもクラスが変わったかのように見えます。ステートパターンは、研究対象のオブジェクトの振る舞いをさまざまなステートオブジェクトに包み込みます。ステート・パターンの目的は、オブジェクトの内部状態が変化したときに、オブジェクトの振る舞いが変化するようにすることです。状態パターンでは、システムが獲得する可能性のある状態ごとに状態クラスのサブクラスを作成する必要があります。システムの状態が変化すると、システムは選択したサブクラスを変更します。

strategyパターン:strategyパターンは、アルゴリズムのセットを対象とし、それぞれを共通のインターフェイスを持つ別のクラスにカプセル化することで、互換性を持たせます。policy パターンでは、クライアントに影響を与えることなくアルゴリズムを変更することができます。strategyパターンは、振る舞い(behavior)と環境(environment)を分離します。環境クラスは振る舞いクラスの保守と照会を担当し、さまざまなアルゴリズムは特定の戦略クラスで提供されます。アルゴリズムは環境から分離されているので、アルゴリズムの追加、削除、修正は環境やクライアントに影響を与えません。

22、テンプレートメソッド - 古典的な記事を読んで "ベッドに行くために女の子を説得する方法"?ベッドに行くために知っているから女の子は変更されていない手順は、偶然の出会いに分割され、行き詰まりを打破するために、追求を開始するには、キス、前戯、手、愛撫、8つのステップで行くが、さまざまな状況のための各ステップは、異なるプラクティスがあり、それはあなたの即興ラに依存します;

テンプレートメソッドパターン: テンプレートメソッドパターンは、ロジックの一部を具象メソッドと具象コンストラクタの形で実装する抽象クラスを用意し、残りのロジックをサブクラスに実装させる抽象メソッドを宣言します。異なるサブクラスは異なる方法でこれらの抽象メソッドを実装することができ、残りのロジックの実装も異なります。トップレベルの論理フレームワークから始め、ロジックの詳細は具象サブクラスに実装を任せます。

23、訪問者-バレンタインデーがここにある、花束とカードを送信するために各MMを与えるために、しかし、各MMは彼女の個人的な特性に花を送信するために、各カードはまた、選択する個々の特性に基づいている必要があり、私は把握する人だ、または少し訪問者を行うには、フラワーショップやギフトショップの所有者の所有者を見つけるために、MMの特性に応じてフラワーショップの所有者が選択するように花束は、ギフトショップの所有者もカードを選ぶために一人一人の特性に応じてみましょう、とても簡単です;

Visitor Pattern: ビジターパターンの目的は、データ構造の要素に適用される操作をカプセル化することです。これらの操作を変更する必要が発生しても、その操作を受け入れるデータ構造は変更されません。アクセサーパターンは、データ構造が比較的未定義のシステムに適しています。 データ構造を、それに作用する操作から切り離すことで、操作のセットを比較的自由に進化させることができます。アクセサパターンを使うと、新しいアクセサクラスを追加することで新しい操作を簡単に追加することができます。visitorパターンは、関連する振る舞いを個々のノードクラスに分散させるのではなく、単一のvisitorオブジェクトに集約します。visitorパターンを使用する場合、オブジェクトのブラウズロジックをサブクラスではなく、できるだけvisitorクラスにまとめます。Visitor パターンは、複数のクラス階層にまたがる異なる階層に属するメンバ・クラスにアクセスできます。

Read next

Mac用PHP/JSプロジェクト開発ツールのおすすめ!

最近、PHPの開発プロジェクトに取り組んでいて、以前はPHPの開発にはzend studioを使っていたのですが、今回、開発ツールを再編成した理由は2つあります。1つは、プロジェクトのフロントエンドの開発が非常に重く、特にJSの作業負荷が高いこと、もう1つは、以前はWindowsを使っていたのですが、今はMacを使っていて、Macと比べるとツールやソフトが充実していて、パワフルなことです。

Jul 8, 2025 · 3 min read